我在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中的缺点。

07-24 09:38
查看更多