2013-11-26 131 views
2

你好,我试图调整一个CSV文件使用Python,但我的输出是有点关闭,我不明白为什么。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

为了将来的参考,您需要在任何代码块之前和之后放置一个空白行以使其工作。我在这里为你修好了。 – abarnert

+0

附注:在这里绝对没有理由使用'csv'。你有一个单列文件。为什么不只是'fout.write()'每一行? (或者,如果您想使用'csv'为将来的扩展留出多个空间,您可能也希望在输入文件中使用它。) – abarnert

回答

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]", ".")) 
+0

谢谢您解决了这个问题。 – user3038303

0

有点OT,但perl的是为这个

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

建将做的工作,其中包括保存新文件在旧文件名上。

+0

为什么在sed中使用perl更容易(而且更轻)?特别是当你添加标志使Perl更像sed-like? – abarnert

+0

是的,我想你是对的,我从来没有打扰记忆sed语法,因为perl解决sed,但不是其他方式。 – vish