在python中逐行读取一个大的压缩文本文件

     2023-02-25     252

关键词:

【中文标题】在python中逐行读取一个大的压缩文本文件【英文标题】:Read a large zipped text file line by line in python 【发布时间】:2012-07-14 00:05:52 【问题描述】:

我正在尝试使用 zipfile 模块来读取存档中的文件。未压缩文件约为 3GB,压缩文件为 200MB。我不希望它们在内存中,因为我逐行处理压缩文件。到目前为止,我注意到使用以下代码的内存过度使用:

import zipfile
f = open(...)
z = zipfile.ZipFile(f)
for line in zipfile.open(...).readlines()
  print line

我是在 C# 中使用 SharpZipLib 完成的:

var fStream = File.OpenRead("...");
var unzipper = new ICSharpCode.SharpZipLib.Zip.ZipFile(fStream);
var dataStream =  unzipper.GetInputStream(0);

dataStream 未压缩。我似乎找不到在 Python 中做到这一点的方法。我们将不胜感激。

【问题讨论】:

【参考方案1】:

Python 文件对象提供迭代器,它将逐行读取。 file.readlines() 将它们全部读取并返回一个列表 - 这意味着它需要将所有内容读入内存。更好的方法(应该始终优先于readlines())是只循环对象本身,例如:

import zipfile
with zipfile.ZipFile(...) as z:
    with z.open(...) as f:
        for line in f:
            print line

注意我对the with statement 的使用——文件对象是上下文管理器,with 语句让我们可以轻松编写可读代码,确保在退出块时(即使出现异常)关闭文件。同样,在处理文件时应该始终使用它。

【讨论】:

不能说比这更好了 @Gareth Latty,是否有关于 open 函数采用什么类型的参数的说明文档?我想看看我是否可以像使用“with open()”函数一样为 open() 设置内存缓冲区 我注意到的另一件事是z.open() 似乎不允许r 选项。当您需要在 for line in f: 块中运行一些逻辑时,这就会发挥作用。 示例: if line.find("YES") != -1: print('yay')。这将返回 TypeError。您必须在"YES" 前面加上b 才能使其工作。 @ericOnline 那是因为你得到的是字节,而不是 unicode 字符串。根据用例,您可能希望将其解码为 UTF-8 以获取真正的字符串,而不仅仅是使用字节字符串。 使用 io.TextIOWrapper;例如with io.TextIOWrapper(z.open(...), encoding='utf-8') as f:

在一个非常大的文件中逐行读取特定的行

】在一个非常大的文件中逐行读取特定的行【英文标题】:Readingaparticularlinebylinenumberinaverylargefile【发布时间】:2012-09-2718:06:13【问题描述】:文件不适合内存。它超过100GB,我想按行号访问特定行。在到达之前我不想逐行数数... 查看详情

如何在 Java 中逐行读取文本文件并分隔每一行的内容?

】如何在Java中逐行读取文本文件并分隔每一行的内容?【英文标题】:Howdoyoureadatextfile,linebyline,andseparatecontentsofeachlineinJava?【发布时间】:2015-10-1401:21:23【问题描述】:我想知道如何读取文件并扫描每一行,但将每一行的内容... 查看详情

在 Fortran 中逐行读取逗号分隔的文本文件

】在Fortran中逐行读取逗号分隔的文本文件【英文标题】:Readingacomma-delimitedtextfileline-by-lineinFortran【发布时间】:2011-09-2209:31:39【问题描述】:我是Fortran新手。我希望能够读取文本文件并将其内容保存在各个变量中。我找到了一... 查看详情

在 Swift 中逐行读取文本文件?

】在Swift中逐行读取文本文件?【英文标题】:ReadatextfilelinebylineinSwift?【发布时间】:2015-10-2501:16:18【问题描述】:我刚开始学习Swift。我已经从文本文件中读取了我的代码,并且应用程序显示了整个文本文件的内容。如何逐行... 查看详情

在 VBA 中逐行读取/解析文本文件

】在VBA中逐行读取/解析文本文件【英文标题】:Read/ParsetextfilelinebylineinVBA【发布时间】:2012-07-1617:45:47【问题描述】:我正在尝试使用VBA解析文本文档并返回文本文件中给出的路径。例如,文本文件如下所示:*Blahblahinstructions*B... 查看详情

在 C 中逐行浏览文本文件

】在C中逐行浏览文本文件【英文标题】:GoingthroughatextfilelinebylineinC【发布时间】:2012-03-0115:24:32【问题描述】:我一直在为我的CIS课程做一个小练习,并且对C用于读取文件的方法感到非常困惑。我真正需要做的就是逐行读取文... 查看详情

如何读取用 7z 压缩的文本文件?

...描述】:我想从7z压缩的csv(文本)文件中逐行读取(在Python2.7中)。我不想解压缩整个(大)文件,而是流式传输。我尝试pylzma.decompressobj()失败。我收到数据错误。请注意,此代码尚未逐行读取:input_filename=r"te 查看详情

Objective C - 创建文本文件以在 Cocoa 中逐行读取和写入

】ObjectiveC-创建文本文件以在Cocoa中逐行读取和写入【英文标题】:ObjectiveC-CreatetextfiletoreadandwritelinebylineinCocoa【发布时间】:2013-07-2017:17:28【问题描述】:我正在构建一个Mac应用程序,我有2个问题:我想创建一个文本文件来读... 查看详情

我应该如何在 Python 中逐行读取文件?

】我应该如何在Python中逐行读取文件?【英文标题】:HowshouldIreadafileline-by-lineinPython?【发布时间】:2012-07-1807:41:35【问题描述】:在史前时代(Python1.4)我们做到了:fp=open(\'filename.txt\')while1:line=fp.readline()ifnotline:breakprintline在Pyt... 查看详情

如何从 C++ 中的文本文件中逐行读取整数? [复制]

】如何从C++中的文本文件中逐行读取整数?[复制]【英文标题】:Howtoreadintegerslinebylinefromatextfileinc++?[duplicate]【发布时间】:2020-02-2420:10:58【问题描述】:所以我有一个关于图表的问题,我必须从输入文件中读取多个案例并检查... 查看详情

从文本文件中逐行提取数据并将其存储在python的列表中[重复]

】从文本文件中逐行提取数据并将其存储在python的列表中[重复]【英文标题】:extractingdatalinebylinefromatextfileandstoringitinalistinpython[duplicate]【发布时间】:2020-07-0920:06:10【问题描述】:我有一个包含不同国家名称的文本文件,如下... 查看详情

在 Java 中逐行处理文本文件和连字符字符串

】在Java中逐行处理文本文件和连字符字符串【英文标题】:ProcessingtextfilesandhyphenatingstringslinebylineinJava【发布时间】:2013-08-0501:51:40【问题描述】:我有一个.txt文件,单列中有8,000行。每行包含一个字母数字或一个数字,如下所... 查看详情

在 Java 中逐行读取和写入大文件的最快方法

】在Java中逐行读取和写入大文件的最快方法【英文标题】:FastestWayToReadandWriteLargeFilesLineByLineinJava【发布时间】:2012-10-2018:41:18【问题描述】:我一直在寻找在内存有限(约64MB)的Java中再次读取和写入大文件(0.5-1GB)的最快方... 查看详情

在 C# 中逐行读取文件

】在C#中逐行读取文件【英文标题】:ReadingafilelinebylineinC#【发布时间】:2010-11-1906:20:55【问题描述】:我正在尝试读取一些文本文件,其中每一行都需要处理。目前我只是使用StreamReader,然后单独读取每一行。我想知道是否有... 查看详情

如何在 Julia 中逐行读取文件?

】如何在Julia中逐行读取文件?【英文标题】:HowtoreadafilelinebylineinJulia?【发布时间】:2020-01-2920:32:14【问题描述】:如何打开文本文件并逐行读取?我对两种不同的情况感兴趣:一次获取数组中的所有行。一次处理每一行。对... 查看详情

如何在目标c中逐行解析JSON文件

】如何在目标c中逐行解析JSON文件【英文标题】:HowtoparseaJSONfilelinebylineinobjectivec【发布时间】:2018-01-0115:33:51【问题描述】:我正在处理非常大的JSON文件,因此我不想读取整个文件然后迭代和解析每个数据条目。相反,我想迭... 查看详情

在 Go 中逐行读取文件

】在Go中逐行读取文件【英文标题】:ReadingafilelinebylineinGo【发布时间】:2012-02-0403:44:52【问题描述】:我在Go中找不到file.ReadLine函数。我可以弄清楚如何快速写一个,但我只是想知道我是否在这里忽略了一些东西。如何逐行读... 查看详情

在批处理文件中逐行读取txt

】在批处理文件中逐行读取txt【英文标题】:Readatxtlinebylineinabatchfile【发布时间】:2012-05-0403:47:56【问题描述】:这是我的问题。我有一个包含100个不同视频名称的txt文件(示例):abc.mpgdef.mpgghi.mpgxyz.mpg我想使用一些命令一个... 查看详情