我有一个包含两列的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
答案 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)