为什么此Python脚本不将一个变量替换为另一个变量?

时间:2018-10-25 08:53:07

标签: python-3.x replace

我有一个包含两列的CSV文件,左边的一个是旧字符串,而右边的一个是新字符串。我有一堆包含旧字符串的.xml文件,我需要用新字符串替换/更新。

该脚本应该一次打开每个.xml文件,然后用新字符串替换CSV文件中的所有旧字符串。我尝试使用replace函数将名为“ column [0]”的旧字符串的实例替换为名为“ column [1]”的新字符串。但是我必须丢失一些东西,因为这似乎无能为力。如果我将替换函数中的第一个变量更改为带引号的实际字符串,那么替换函数将起作用。但是,如果replace函数中的两个术语都是变量,则不是。

有人知道我在做什么错吗?

import os
import csv

with open('csv.csv') as csv:
    lines = csv.readline()
    column = lines.split(',')

    fileNames=[f for f in os.listdir('.') if f.endswith('.xml')]
    for f in fileNames:
        x=open(f).read()
        x=x.replace(column[0],column[1])
        print(x)

CSV文件示例:

oldstring1,newstring1
oldstring2,newstring2

.xml文件示例:

Word words words oldstring1 words words words oldstring2

在新的.xml文件中我想要什么:

Word words words newstring1 words words words newstring2

2 个答案:

答案 0 :(得分:1)

使用sed似乎更好。但是。

如果我们要使用Python,在我看来,您想做的事是最好的实现

  • 读取所有过时的替换对并将其存储在列表中,
  • 使用方便的fileinput模块,在命令行中指定的.xml文件中进行循环,在命令行中指定 ,指定我们要进行内联操作,并且想保留备份文件,
    • 对于每个.xml中的每一行,操作所有替换项,
    • 将修改后的行放回原始文件中(由于print的神奇之处,只需使用fileinput即可)(end='',因为我们不想将每一行都剥离到保留最终的空白)。
import fileinput
import sys

old_new = [line.strip().split(',') for line in open('csv.csv')]

for line in fileinput.input(sys.argv[1:], inplace=True, backup='.bak'):
    for old, new in old_new:
        line = line.replace(old, new)
    print(line, end='')

如果将代码保存在replace.py中,您将像这样执行它

$ python3 replace.py *.xml subdir/*.xml another_one/a_single.xml

答案 1 :(得分:1)

这里的问题是您将csv文件视为普通文本文件,而不是遍历csv文件中的所有行。

您需要使用csv阅读器读取文件

以下代码将适合您的任务

import os
import csv
with open('csv.csv') as csvfile:
    reader = csv.reader(csvfile)
    fileNames=[f for f in os.listdir('.') if f.endswith('.xml')]
    for f in fileNames:
        x=open(f).read()
        for row in reader:
            x=x.replace(row[0],row[1])
        print(x)