我有大约50 GB的文本文件,我正在检查每行的前几个字符,并将其写入为该起始文本指定的其他文件。
例如。 我的输入包含:
cow_ilovecow
dog_whreismydog
cat_thatcatshouldgotoreddit
dog_gotitfromshelter
...............
所以,我想在牛,狗和猫(约200个)类别中处理它们 所以,
if writeflag==1:
writefile1=open(writefile,"a") #writefile is somedir/dog.txt....
writefile1.write(remline+"\n")
#writefile1.close()
所以,什么是最好的方式,我应该关闭吗?否则,如果我保持开放,writefile1=open(writefile,"a")
正在做正确的事吗?
答案 0 :(得分:39)
你一定要尝试尽可能少地打开/关闭文件
因为即使与文件读/写相比,文件打开/关闭也要贵得多
考虑两个代码块:
f=open('test1.txt', 'w')
for i in range(1000):
f.write('\n')
f.close()
和
for i in range(1000):
f=open('test2.txt', 'a')
f.write('\n')
f.close()
第一个需要 0.025s ,而第二个需要 0.309s
答案 1 :(得分:5)
使用with
语句,它会自动为您关闭文件,执行with
块内的所有操作,因此它会为您打开文件,并在您关闭文件后关闭文件'离开with
区块。
with open(inputfile)as f1, open('dog.txt','a') as f2,open('cat.txt') as f3:
#do something here
修改强>
如果你知道在编译代码之前要使用的所有可能的文件名,那么使用with
是一个更好的选择,如果你不这样做,那么你应该使用你的方法,而不是关闭文件你可以{{1使用flush
答案 2 :(得分:1)
让它一直保持开放!否则,您告诉系统您已经完成了所有写入操作,并且可能决定将其刷新到磁盘上而不是缓冲它。由于显而易见的原因, n 磁盘写入比 1 磁盘写入要昂贵得多。
如果你想附加到文件而不是覆盖它,那么是的,a
是正确的模式。
答案 3 :(得分:-1)
IO操作消耗太多时间。同时打开和关闭文件。
如果打开两个文件(输入和输出),使用内存缓冲区,比如10MB大小进行文本处理,然后将其写入输出文件,速度会快得多。例如:
file = {} # just initializing dicts
filename = {}
with open(file) as f:
file['dog'] = None
buffer = ''
...
#maybe there is a loop here
if writeflag:
if file['dog'] == None:
file['dog'] = open(filename['dog'], 'a')
buffer += remline + '\n'
if len(buffer) > 1024*1000*10: # 10MB of text
files['dog'].write(buffer)
buffer = ''
for v in files.values():
v.close()