gpt4 book ai didi

python - 改进Python代码读取文件

转载 作者:行者123 更新时间:2023-11-30 23:33:17 25 4
gpt4 key购买 nike

我写了一个Python脚本来处理文本文件。输入是一个包含多行的文件。每行的开头有一个数字 (1, 2, 3..., n)。然后是一个空行,最后一行写有一些文本。

我需要通读这个文件来删除开头的一些行和结尾的一些行(比如第 1 到 5 行,然后是第 78 行到结尾)。我想将剩余的行写入一个新文件(在一个新目录中),并对这些行上写入的第一个数字重新编号(在我的示例中,6 将变为 1、7 2 等)

我写了以下内容:

def treatFiles(oldFile,newFile,firstF, startF, lastF):

% firstF is simply an index
% startF corresponds to the first line I want to keep
% lastF corresponds to the last line I want to keep
numberFToDeleteBeginning = int(startF) - int(firstF)
with open(oldFile) as old, open(newFile, 'w') as new:
countLine = 0
for line in old:
countLine += 1
if countLine <= numberFToDeleteBeginning:
pass
elif countLine > int(lastF) - int(firstF):
pass
elif line.split(',')[0] == '\n':
newLineList = line.split(',')
new.write(line)
else:
newLineList = [str(countLine - numberFToDeleteBeginning)] + line.split(',')
del newLineList[1]
newLine = str(newLineList[0])
for k in range(1, len(newLineList)):
newLine = newLine + ',' + str(newLineList[k])
new.write(newLine)


if __name__ == '__main__':
from sys import argv
import os

os.makedirs('treatedFiles')
new = 'treatedFiles/' + argv[1]
treatFiles(argv[1], argv[2], newFile, argv[3], argv[4], argv[5])

我的代码工作正常,但速度太慢(我有大约 10Gb 的文件需要处理,并且它已经运行了几个小时)。

有人知道我该如何改进吗?

最佳答案

我会去掉中间的for循环和昂贵的.split():

from itertools import islice

def treatFiles(old_file, new_file, index, start, end):
with open(old_file, 'r') as old, open(new_file, 'w') as new:
sliced_file = islice(old, start - index, end - index)

for line_number, line in enumerate(sliced_file, start=1):
number, rest = line.split(',', 1)

if number == '\n':
new.write(line)
else:
new.write(str(line_number) + ',' + rest)

此外,在将三个数字参数传递给函数之前将它们转换为整数:

treatFiles(argv[1], argv[2], newFile, int(argv[3]), int(argv[4]), int(argv[5]))

关于python - 改进Python代码读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18948506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com