我在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 = ''
正确的块,或者如果完全省略了
res
并且代码继续运行用户需要的实际文件,您最终将编写内容
前一个读取文件到下一个文件以及最后一个文件
文件将具有所有读取文件的内容。那就是你的原因
在测试环境中使用此代码或谨慎使用。
该代码仅用于演示如何实现所需的效果,以一个字符串开头的文件行加上另一个字符串作为前缀。因此,建议对该代码稍作改进。例如,除了读取文件的所有内容并将它们存储在
res
外,您可以简单地保存需要加上前缀的行号,从而无需将所有数据加载到内存中。 enumerate
也可能有助于返回文件号,它在2.7中返回可迭代。消除res
不仅可以节省内存,而且可以消除项目符号2中的缺点。