您的第一个问题是currentx.read()
返回一个巨大的字符串,因此循环遍历该字符串中的每个字符,而不是文件中的每一行。
您可以将文件作为巨大的字符串列表读入内存,如下所示:
current_data = list(currentx)
但是,这几乎可以保证比一次遍历文件一行要慢(因为您浪费时间为整个文件分配内存,而不是让 Python 选择一个合理大小的缓冲区)或一次处理整个文件(因为你在浪费时间分割线)。换句话说,你会以这种方式得到两全其美的结果。
因此,要么将其作为迭代器保留在行上:
next(currentx) # skip a line
for line in currentx:
# do something with each line
…或者将其保留为字符串并从第一行拆分:
current_data = currentx.read()
first, _, rest = current_data.partition('\n')
# do something with rest
如果事实证明一次读取和写入文件太慢怎么办(这很可能——它会在写入之前将早期块从任何缓存中强制出来,防止交错,并浪费时间分配内存),但是一行一次也太慢了(这不太可能,但并非不可能——在 Python 中搜索换行符、复制小字符串和循环不是免费的,只是 CPU 时间比 I/O 时间便宜得多很少重要)?
您能做的最好的事情就是选择一个理想的块大小并自己进行无缓冲的读取和写入,并且只浪费时间搜索换行符,直到找到第一个换行符。
如果你可以假设第一行永远不会超过块大小,这很容易:
BLOCK_SIZE = 8192 # a usually-good default--but if it matters, test
with open(inpath, 'rb', 0) as infile, open(outpath, 'wb', 0) as outfile:
buf = infile.read(BLOCK_SIZE)
first, _, rest = buf.partition(b'\n')
outfile.write(rest)
while True:
buf = infile.read(BLOCK_SIZE)
if not but:
break
outfile.write(buf)
如果我要多次这样做,我会编写一个块文件迭代器函数(或者,更好的是,寻找一个预先测试过的配方——它们都在 ActiveState 和邮件列表中)。