[英]Python: Find and replace strings in batch csv files
我有数百个csv文件,我想搜索字符串“ Keyed,Bet”并将其更改为“ KeyedBet”。 该字符串可能在文件中或不在文件中,并且可能在不同文件的不同列中。
我将下面的脚本拼凑在一起,但是它不起作用。 我肯定使用了不正确的replace(),但无法完全弄清楚,并且在我真的不需要时创建新文件-如果它只是更新当前文件并以相同的名称保存,那将是很好(但超出了我的初学者能力)。
我在哪里错了? 谢谢您的帮助!
import os
import csv
path='.'
filenames = os.listdir(path)
for filename in filenames:
if filename.endswith('.csv'):
r=csv.reader(open(filename))
new_data = []
for row in r:
replace("Keyed,Bet","KeyedBet")
new_data.append(row)
newfilename = "".join(filename.split(".csv")) + "_edited3.csv"
with open(newfilename, "w") as f:
writer = csv.writer(f)
writer.writerows(new_data)
为什么要重新发明轮子? 只需下载sed及其依赖项 ,然后
sed -i 's/Keyed,Bet/KeyedBet/ig' *.csv
编辑:上面的命令应该在Linux上正常工作。 Windows sed
要求其带引号的标记被双引号而不是单引号。
sed -i "s/Keyed,Bet,KeyedBet/ig" *.csv
如果要更改原始文件,可以使用带inplace inplace=True
fileinput.input实际修改原始文件, glob
会在给定目录中找到所有适合您的csv文件:
from glob import iglob
import fileinput
path = '.'
for line in fileinput.input(iglob(os.path.join(path, "*.csv")),inplace=True):
print(line.replace("Keyed,Bet", "KeyedBet"),end="")
一行不多,但少于15行。
要创建新文件:
path='.'
from glob import iglob
for filename in iglob(os.path.join(path,"*.csv")):
with open(os.path.join(path,filename)) as f,open(os.path.join(path, os.path.splitext(filename)[0]+ "_edited3.csv"), "w") as f2:
for line in f:
f2.write(line.replace("Keyed,Bet", "KeyedBet"))
考虑到您要替换字符串,如果不使用csv模块就直接打开文件并使用str.replace
会更容易,如果您知道字符串始终出现在同一行中,那么csv模块将是一个更好的选择,但似乎可以出现子字符串任何地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.