2013-11-26 218 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