每次打开/关闭Python文件与保持打开直到进程完成

时间:2012-07-05 16:56:55

标签: python file-io

我有大约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")正在做正确的事吗?

4 个答案:

答案 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操作消耗太多时间。同时打开和关闭文件。

如果打开两个文件(输入和输出),使用内存缓冲区,比如1​​0MB大小进行文本处理,然后将其写入输出文件,速度会快得多。例如:

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()