在Python中查找,替换多个列表中的内联文件

时间:2016-11-18 16:14:16

标签: python

我有三个python列表:

  1. 文件路径
  2. 的textToFind
  3. textToReplace
  4. 列表总是长度相同且顺序正确。

    我需要在filePaths中打开每个文件,在textToFind中找到该行,并用textToReplace替换该行。我有填充列表的所有代码。我坚持要做替换。我试过了:

     for line in fileinput.input(filePath[i], inplace=1):
         sys.stdout.write(line.replace(find[i], replace[i]))
    

    如何迭代每个文件以在与find匹配的每一行上进行文本替换?

3 个答案:

答案 0 :(得分:0)

我可能会在没有更多信息的情况下做这样的事情

for my_file in file_paths:
    with open(my_file, 'r') as cin, open(my_file, 'w') as cout:
        lines = cin.readlines() #store the file in mem so i can overwrite it.
        for line in lines:
            line = line.replace(find, replace) # change as needed
            cout.write(line)

迭代所有文件路径,打开文件进行读取,然后单独写入文件。将文件行存储在变量中,如下所示,我将覆盖原始文件。做你的替换,记住是否有什么可以替换python只留下线。将该行写回文件。

答案 1 :(得分:0)

您可以将文件读取到某个临时变量,进行更改,然后将其写回:

with open('file', 'r') as f:
    text = f.read()
with open('file', 'w') as f:
    f.write(text.replace('aaa', 'bbb'))

答案 2 :(得分:0)

当您需要在迭代序列时使用序列中项目的索引时,请使用enumerate

for i, path in enumerate(filePath):
    for line in fileinput.input(path, inplace=1):
        sys.stdout.write(line.replace(find[i], replace[i]))

另一种选择是使用zip,它会按顺序为每个序列提供一个项目。

for path, find_text, replace_text in zip(filePath, textToFind, textToReplace):
    for line in fileinput.input(path, inplace=1):
        sys.stdout.write(line.replace(find_text, replace_text)) 

请注意,对于Python 2.x zip将生成一个可以迭代的新列表 - 所以如果你正在压缩的序列很大,它将消耗内存。 Python 3.x zip生成一个迭代器,因此它不具备该功能。

使用普通文件对象,您可以将整个文件读入变量,并立即对整个文件执行字符串替换。