44

我有大约 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

4 回答 4

60

您绝对应该尝试尽可能少地打开/关闭文件

因为即使与文件读/写相比,文件打开/关闭的成本也要高得多

考虑两个代码块:

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

于 2012-07-05T17:32:25.357 回答
6

使用该with语句,它会自动为您关闭文件,执行with块内的所有操作,因此它将为您保持打开文件,并在您离开with块后关闭文件。

with open(inputfile)as f1, open('dog.txt','a') as f2,open('cat.txt') as f3:
   #do something here

编辑: 如果您知道在编译代码之前要使用的所有可能的文件名,那么 usingwith是一个更好的选择,如果您不这样做,那么您应该使用您的方法,而不是关闭文件,您可以flush使用将数据保存到文件中writefile1.flush()

于 2012-07-05T17:00:23.757 回答
2

始终保持打开状态!否则,您会告诉系统您已完成所有时间的写入,并且它可能会决定将其刷新到磁盘上而不是缓冲它。由于显而易见的原因,n次磁盘写入比1次磁盘写入要昂贵得多。

如果您想附加到文件而不是覆盖它,那么是的,a是正确的模式。

于 2012-07-05T16:59:25.307 回答
0

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()
于 2012-07-05T17:22:10.820 回答