gpt4 book ai didi

python - 如何使用 fileinput 编辑多个文件?

转载 作者:太空宇宙 更新时间:2023-11-03 15:19:07 25 4
gpt4 key购买 nike

我在 python 2.7 中使用 os.walk 打开多个文件,然后将这些文件的所有感兴趣的行添加到列表中。稍后我想用 fileinput 编辑这些行并关闭它。我怎样才能实现这个目标?使用下面的代码是我打开文件的方式:

import os
import fnmatch
import fileinput

lines = []

def openFiles():
for root, dirs, files in os.walk('/home/test1/'):
for lists in fnmatch.filter(files, "*.txt"):
filepath = os.path.join(root, lists)
print filepath
with open(filepath, "r") as sources:#opens 8 files and read their lines
#edit = fileinput.input(filepath, inplace=1)
for line in sources:
if line.startswith('xe') :
lines.append(line)

然后,对于以 xe 开头的每一行,我想在其前面添加一个 #,然后关闭该文件。我想在不同的函数中做到这一点。

最佳答案

这是我的做法,添加到您的代码中:

import os
import fnmatch
import fileinput


def openFiles(dir):
filePaths = []
for root, dirs, files in os.walk(dir):
for textFile in fnmatch.filter(files, "*.txt"):
filepath = os.path.join(root, textFile)
filePaths.append(filepath)
return filePaths

def prefixLines(filepaths, chartoPrefix, prefixWith):
res = ''
for filepath in filepaths:
# Read file
with open(filepath, 'r') as f:
for line in f:
if line.startswith(chartoPrefix):
res += prefixWith + line
else:
res += line
# Write to file
with open(filepath, 'w') as f:
f.write(res)
res = '' # Rest res

prefixLines(openFiles(r'/home/test1/'), 'xe', '#')

prefixLines 有很多缺点:

  • 因为我们读取了文件的所有行并将它们存储在 res 中,所以我们对于大文件可能会出现内存不足的情况。

  • 如果程序员忘记缩进 res = ''右 block 或者如果 res 被完全省略并且代码运行在用户需要的实际文件,您最终将编写内容上一个读取的文件到下一个文件和最后一个文件文件将包含所有读取文件的内容。这就是为什么你已在测试环境中使用此代码或谨慎使用。

此代码仅用于演示如何实现所需的效果,即为以一个字符串开头的文件行添加另一个字符串作为前缀。因此,建议稍微改进此代码。例如,您可以简单地保存需要添加前缀的行号,从而无需将所有数据加载到内存中,而不是读取文件的所有内容并将其存储在 res 中。 enumerate 也有助于返回文件编号,它在 2.7 中返回一个可迭代对象。通过消除 res,我们不仅可以节省内存,还可以消除第 2 条中的缺点。

关于python - 如何使用 fileinput 编辑多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43655566/

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