2013-04-01 105 views
2

這個主題看起來已經有些東西了(How to replace all those Special Characters with white spaces in python?),但是我無法將這個簡單的任務變成我的生活。使用python刪除csv文件中的特殊字符

我有一個包含75列和近4000行的.CSV文件。我需要用'_'替換所有'特殊字符'($#& * ect)並寫入新文件。這是我到目前爲止有:

import csv 

input = open('C:/Temp/Data.csv', 'rb') 
lines = csv.reader(input) 
output = open('C:/Temp/Data_out1.csv', 'wb') 
writer = csv.writer(output) 

conversion = '-"/.$' 
text = input.read() 
newtext = '_' 
for c in text: 
    newtext += '_' if c in conversion else c 
    writer.writerow(c) 

input.close() 
output.close() 

這一切都成功地做的是將所有內容寫到輸出文件作爲一列,年產量超過65K行。此外,特殊字符仍然存在!

對不起,多餘的問題。 提前謝謝!

回答

4

我可能會做這樣的事情

import csv 

with open("special.csv", "rb") as infile, open("repaired.csv", "wb") as outfile: 
    reader = csv.reader(infile) 
    writer = csv.writer(outfile) 
    conversion = set('_"/.$') 
    for row in reader: 
     newrow = [''.join('_' if c in conversion else c for c in entry) for entry in row] 
     writer.writerow(newrow) 

果然

$ cat special.csv 
th$s,2.3/,will-be 
fixed.,even.though,maybe 
some,"shoul""dn't",be 

(請注意,我有一個引用的值)爲

$ cat repaired.csv 
th_s,2_3_,will-be 
fixed_,even_though,maybe 
some,shoul_dn't,be 

現在,你的代碼正在讀取整個文本成一個大線:

newtext = '_' 

循環執行的每一個字符text

text = input.read() 

_字符開始

for c in text: 

將更正的字符添加到newtext(非常慢):

newtext += '_' if c in conversion else c 

然後寫字符,如一個欄目,一個新的CSV(?):

writer.writerow(c) 

..這是不太可能你想要什麼。 :^)

+0

嗨,你能解釋更多關於如何'newrow = [''.join('_'如果在轉換中的c其他的c爲c中的條目)進入行]'這行代碼是運作? – tortuga

4

這似乎並不需要特別處理CSV(只要特殊字符不是您的列分隔符)。

lines = [] 
with open('C:/Temp/Data.csv', 'r') as input: 
    lines = input.readlines() 

conversion = '-"/.$' 
newtext = '_' 
outputLines = [] 
for line in lines: 
    temp = line[:] 
    for c in conversion: 
     temp = temp.replace(c, newtext) 
    outputLines.append(temp) 

with open('C:/Temp/Data_out1.csv', 'w') as output: 
    for line in outputLines: 
     output.write(line + "\n") 
+0

我覺得你的循環邏輯是錯的:將輸出'LEN(轉換)'行的每一行,不是嗎? – DSM

+0

@ DSM-好,趕快,謝謝!更新與修復:) – dckrooney

0

除了@ Nisan.H指出的錯誤和@dckrooney所提出的有效性,你可能不需要在這種情況下以特殊的方式處理文件,只是因爲它是一個CSV文件(見下文我的意見):

  1. writer.writerow()應採取串序列,每一個會寫出來用逗號(見here)分離。在你的情況下,你正在寫一個單一的字符串。
  2. 此代碼設置爲從'C:/ Temp/Data'讀取。csv'在兩個方法 - 通過input和通過lines,但它實際上只從input讀取(因此代碼不處理作爲CSV文件的文件)。
  3. 該代碼將字符附加到newtext並寫出該變量的每個版本。因此,newtext第一版本將是1個字符長,第二2個字符長,長的第三3個字符等

最後,考慮到將CSV文件可以具有在它的引號,它實際上可能需要將輸入文件專門作爲CSV來處理,以避免替換要保留的引號,例如引用標記以保護存在於CSV文件字段中的逗號。在這種情況下,需要分別處理CSV文件的每個字段,然後將每行寫入新的CSV文件。

+0

太棒了。這工作!謝謝大家,通過這個走過我。 – Jenny

+0

@珍妮:很高興幫助。如果我是你,我傾向於選擇帝斯曼的答案是正確的,因爲它是最完整和最詳細的答案。這也可以避免其他人看到這個問題,並認爲它還沒有得到答案。 – Simon

0

也許嘗試

s = open('myfile.cv','r').read() 

chars = ('$','%','^','*') # etc 
for c in chars: 
    s = '_'.join(s.split(c)) 

out_file = open('myfile_new.cv','w') 
out_file.write(s) 
out_file.close() 
+0

如果你想因任何原因寫行,那麼在循環後執行'rows = s.split('\ n')' – dermen