Python:替换CSV文件中的数据

时间:2013-11-26 21:40:14

标签: python csv

您好我正在尝试使用Python调整CSV文件,但我的输出有点偏,我无法弄清楚原因。

in_file = open(out, "rb")
fout = "DomainWatchlist.csv"
fin_out_file = open(fout, "wb")
csv_writer2 = csv.writer(fin_out_file, quoting=csv.QUOTE_MINIMAL)
for item in in_file:
if "[.]" in item:
    csv_writer2.writerow([item.replace("[.]", ".")])
elif "[dot]" in item:
    csv_writer2.writerow([item.replace("[dot]", ".")])
else:
    csv_writer2.writerow([item])

in_file.close
fin_out_file.close

输入文件包含如下所示的数据:

bluecreatureoftheseas.com
12rafvwe[dot]co[dot]cc
12rafvwe[dot]co[dot]cc
404page[dot]co[dot]cc
abalamahala[dot]co[dot]cc
abtarataha[dot]co[dot]cc
adoraath[dot]cz[dot]cc
adoranaya[dot]cz[dot]cc
afnffnjq[dot]co[dot]cc
aftermorningstar[dot]co[dot]cc

我正在尝试修复此数据,但它看起来像这样:

"12rafvwe.co.cc
"
"12rafvwe.co.cc
"
"404page.co.cc
"
"abalamahala.co.cc
"
"abtarataha.co.cc
"
"adoraath.cz.cc
"
"adoranaya.cz.cc
"
"afnffnjq.co.cc
"
"aftermorningstar.co.cc
"
"aftrafsudalitf.co.cc
"
"agamafym.cz.cc
"
"agamakus.vv.cc

为什么这会创建额外的引号,然后添加回车符?

2 个答案:

答案 0 :(得分:3)

您获取换行符的原因是for item in in_file:遍历in_file中的每一行,而不会删除换行符。您不会在任何地方删除换行符。所以它仍然存在于传递给writerow的列表中的单个字符串中。

您获得引号的原因是,在CSV中,具有特殊字符的字符串(如换行符)必须进行转义或引用。您可以设置不同的“方言选项”来控制它,但默认情况下,它会尝试使用引号而不是转义。

所以,解决方案是这样的:

for item in in_file:
    item = item.rstrip()
    # rest of your code

您的代码还存在其他一些问题,以及某些方法使您的事情变得比他们需要的更复杂。

首先,in_file.close不会关闭文件。您没有调用该函数,只是将其称为函数对象。你需要括号来用Python调用函数。

但处理结束文件的一种更简单的方法是使用with语句。

您只有一列,因此根本不需要使用csv模块。只需fin_out_file.write即可。

您可能也不想在这里使用二进制模式。如果你有充分的理由这样做,那很好,但是如果你不知道为什么要使用它,请不要使用它。

您不需要在replace之前检查子字符串是否存在。如果您致电'abc'.replace('n', 'N'),它将无害地返回'abc'。您所做的只是编写两倍的代码,并使Python连续两次搜索每个字符串。

把这些全部放在一起,这里的内容分为三行:

with open(out) as in_file, open(fout, 'w') as out_file:
    for line in in_file:
        out_file.write(line.replace("[.]", ".").replace("[dot]", "."))

答案 1 :(得分:0)

有点OT但perl是为此构建的

$ perl -i -ple 's/\[dot\]/./g' filename

将完成这项工作,包括将新文件保存在oldfilename上。