在Python中逐行将文本字符串附加到不同的行以避免内存错误-更快的替代方法?

在Python中逐行将文本字符串附加到不同的行以避免内存错误-更快的替代方法?,python,Python,我有一个名为XXX_USR.txt的大文件。我反复浏览文件夹,其中一些txt文件的大小超过500 MB。为了避免内存错误,我需要逐行追加文件。然而,我目前的方法太慢了。第一行由|SYS追加,所有其他行由'|'+amendtext追加amendtext是一个变量,它从.txt文件名的第一个字符串中提取第一个下划线,例如“XXX” 我的代码太慢了,但是内存出错了 import os import glob from pathlib import Path cwd = 'C:\\Users\\Eri

我有一个名为XXX_USR.txt的大文件。我反复浏览文件夹,其中一些txt文件的大小超过500 MB。为了避免
内存错误
,我需要逐行追加文件。然而,我目前的方法太慢了。第一行由
|SYS
追加,所有其他行由
'|'+amendtext
追加
amendtext
是一个变量,它从.txt文件名的第一个字符串中提取第一个下划线,例如“XXX”

我的代码太慢了,但是内存出错了

import os
import glob
from pathlib import Path

cwd = 'C:\\Users\\EricClapton\\'

directory = cwd

txt_files = os.path.join(directory, '*.txt')

for txt_file in glob.glob(txt_files):
    cpath =(Path(txt_file).resolve().stem)

    nametxt = "-".join(cpath.split('_')[0:1])
    amendtext = "|  " + nametxt
    systext = "|   SYS"

    with open(txt_file,'r', errors='ignore') as f:
        get_all=f.readlines()

    with open(txt_file,'w') as f:
        for i,line in enumerate(get_all,1):        
            if i == 1:                              
                f.writelines(systext + line)
            else:
                f.writelines(amendtext + line)

你说的太慢到底是什么意思?它是在几秒钟内运行还是在几分钟内运行?我可以说我在我的笔记本电脑上运行了类似的情况,对于一个超过1G和35946689行的文件,大约需要29秒

我使用模块以编辑类型模式打开文件,而不是
read
和/或
write
。这消除了在使用数据时双重存储数据的需要

with in_place.InPlace(txt_file) as f:
    for line in f:
        f.write(amendtext + line)
另外,不要从IDE运行它。我可以减慢这个过程,也可以限制你做什么

更新: 我想我知道是什么原因导致了你执行时间的延迟。在原始代码中,循环遍历文件内容时,每次迭代都要执行条件检查。
在更新的代码中,您现在打开文件进行四次读写,并存储其所有内容。下面是更新后的代码,它将处理您在无条件检查的情况下修改第一行的需要

with in_place.InPlace(txt_file) as f:
    f.write(systext + f.readline())
    for line in f:
        f.write(amendtext + line)
带的
内的第一行将从文本文件中读取第一行,修改它,然后写入。

此时,迭代器将移动到下一行,从该行可以根据需要处理数据

最后,
enumerate
方法不适合逐行读取如此大的文件并枚举行。我使用了
readlines
方法。不,我正在将文件读入单独的块中,然后写入并附加带有前置字符串的文件

import os
import glob
from pathlib import Path

cwd = 'C:\\Users\\EricClapton\\'

directory = cwd

txt_files = os.path.join(directory, '*.txt')

for txt_file in glob.glob(txt_files):
    cpath =(Path(txt_file).resolve().stem)

    nametxt = "-".join(cpath.split('_')[0:1])
    amendtext = "|  " + nametxt
    systext = "|   SYS"

with open(txt_file,'r', errors='ignore') as f:
    get_all=f.readlines()[:1]

with open(txt_file,'r', errors='ignore') as s:
    get_itdone=s.readlines()[1:]

with open(txt_file, 'w') as k:
    for line in get_all:
        k.write(systext + line)

with open(txt_file, 'a+') as a:
    for line in get_itdone:
        a.write(amendtext + line)

这是一个很好的建议,但它不能直接解决我在所选行中写入两个不同字符串的问题。这可能会有帮助,您需要相应地修改此代码,不能总是期望有一个量身定制的女佣解决方案我已经用open
方法测试了
,也测试了
就地
它们都很快。问题显然在我的
行中,在enumerate(get_all,1):
和行的枚举中。@kokoko请根据您的评论查看我的更新答案。我是按自己的方式做的,但我也尝试了您的方式,效果很好。谢谢你把我介绍给你。
import os
import glob
from pathlib import Path

cwd = 'C:\\Users\\EricClapton\\'

directory = cwd

txt_files = os.path.join(directory, '*.txt')

for txt_file in glob.glob(txt_files):
    cpath =(Path(txt_file).resolve().stem)

    nametxt = "-".join(cpath.split('_')[0:1])
    amendtext = "|  " + nametxt
    systext = "|   SYS"

with open(txt_file,'r', errors='ignore') as f:
    get_all=f.readlines()[:1]

with open(txt_file,'r', errors='ignore') as s:
    get_itdone=s.readlines()[1:]

with open(txt_file, 'w') as k:
    for line in get_all:
        k.write(systext + line)

with open(txt_file, 'a+') as a:
    for line in get_itdone:
        a.write(amendtext + line)