改善Python代码读取文件功能

2024-09-30 01:30:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个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的文件要处理,它已经运行了几个小时)。你知道吗

有人知道我该怎么改进吗?你知道吗


Tags: 文件tonewlinenewline数字intargv
1条回答
网友
1楼 · 发布于 2024-09-30 01:30:56

我会去掉中间的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]))

相关问题 更多 >

    热门问题