您好我正在尝试使用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
为什么这会创建额外的引号,然后添加回车符?
答案 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上。