我正在处理大数据,因此找到一种阅读数据的好方法非常重要。 我对不同的阅读方法感到有些困惑。
1.f=gzip.open(file,'r')
for line in f:
process line
#how can I process nth line? can I?
2.f=gzip.open(file,'r').readlines()
#f is a list
f[10000]
#we can process nth line
3.f=gzip.open(file,'r')
while True:
linelist=list(islice(f,4))
4.for line in fileinput.input():
process line
2和3有什么区别?我发现他们的内存使用情况是一样的。 islice()还需要先将整个文件加载到内存中(但稍后才会逐位加载)。 而且我听说第四种方法消耗的内存最少,它实际上是一点一点地处理,对吧? 对于10GB级文件,您会推荐哪种文件读取方法?欢迎任何想法/信息。 THX
编辑:我认为我的一个问题是我需要随机选择特定的行。 说:
f1=open(inputfile1, 'r')
while True:
line_group1 = list(islice(f1, 3))
if not line_group1:
break
#then process specific lines say, the second line.
processed 2nd line
if ( ....):
LIST1.append(line_group1[0])
LIST1.append(processed 2nd line)
LIST1.append(line_group1[2])
然后......喜欢
with open(file,'r') as f,
for line in f:
# process line
可能无效,我是否正确?
答案 0 :(得分:5)
查看David M. Beazley关于使用生成器解析大型日志文件的演讲(请参阅演示文稿的pdf):
答案 1 :(得分:5)
你忘记了 -
with open(...) as f:
for line in f:
<do something with line>
with
语句处理打开和关闭文件,包括是否在内部块中引发异常。 for line in f
将文件对象f
视为可迭代,它自动使用缓冲的IO和内存管理,因此您不必担心大文件。
两个2,3都不建议大文件阅读&amp;在处理开始之前将整个文件内容加载到内存中。要读取大文件,您需要找到一次不读取整个文件的方法。
应该有一种 - 最好只有一种 - 显而易见的方法。
答案 2 :(得分:1)
您可以在迭代某些内容时使用enumerate
来获取索引:
for idx, line in enumerate(f):
# process line
简单且内存效率高。您实际上也可以使用islice
,并迭代它而不先转换为列表:
for line in islice(f,start,stop):
# process line
这两种方法都不会将整个文件读入内存,也不会创建中间列表。
对于fileinput
,它只是一个快速循环标准输入或文件列表的辅助类,使用它没有内存效率优势。
正如Srikar指出的那样,使用with
语句是打开/关闭文件的首选方式。
答案 3 :(得分:0)
在您阅读并计算其中有多少\ n之前,您不知道有多少行。 在1中,您可以添加枚举来获取行号。
答案 4 :(得分:0)
要阅读大文件中的特定行,您可以使用linecache library。