2013-01-17 272 views
4

我想在每行/行的中間有^ M字符的python中,它是一個換行符的csv文件。我無法以'rU'以外的任何模式打開文件。從csv文件中刪除換行

如果我在'rU'模式下打開文件,它會讀入換行符並分割文件(創建一個換行符)並給出兩倍的行數。

我想完全刪除換行符。怎麼樣?

+1

'dos2unix'是你想要的。 – squiguy

回答

11

需要注意的是,爲the docs說:

csvfile can be any object which supports the iterator protocol and returns a string each time its next() method is called — file objects and list objects are both suitable.

所以,你可以隨時遞給你readerDictReader之前貼在文件過濾器。取而代之的是:

with open('myfile.csv', 'rU') as myfile: 
    for row in csv.reader(myfile): 

這樣做:

with open('myfile.csv', 'rU') as myfile: 
    filtered = (line.replace('\r', '') for line in myfile) 
    for row in csv.reader(filtered): 

'\r'是拼寫^M的Python的(和C)的方式。所以,這只是將所有^M個字符都去掉,無論它們出現在哪裏,都用空字符串替換每個字符。


I guess I want to modify the file permanently as opposed to filtering it.

首先,如果你想在其上運行你的Python腳本之前修改文件,爲什麼不這樣做,從Python的以外? sedtr,許多文本編輯器等都可以爲您做到這一點。這裏有一個GNU sed的例子:

gsed -i'' 's/\r//g' myfile.csv 

但是,如果你想這樣做在Python中,它不是更囉嗦了,你可能會發現它的可讀性,所以:

首先,你不能如果你想插入或從中間刪除,真正修改文件。通常的解決方案是編寫一個新文件,並將新文件移到舊文件(僅限於Unix)或刪除舊文件(跨平臺)。

的跨平臺版本:

os.rename('myfile.csv', 'myfile.csv.bak') 
with open('myfile.csv.bak', 'rU') as infile, open('myfile.csv', 'wU') as outfile: 
    for line in infile: 
     outfile.write(line.replace('\r')) 
os.remove('myfile.csv.bak') 

越少,笨重,但僅限Unix版本:

temp = tempfile.NamedTemporaryFile(delete=False) 
with open('myfile.csv', 'rU') as myfile, closing(temp): 
    for line in myfile: 
     temp.write(line.replace('\r')) 
os.rename(tempfile.name, 'myfile.csv') 
+1

生成器表達式的+1 –

+0

我想我想永久修改文件而不是過濾它。你的代碼將它過濾掉,但是有沒有辦法打開這個文件,然後刪除^ M並關閉它,從而永久修改它?例如在上面的例子中,一旦我打印行,我確實看到換行符。不知道我缺少什麼。我的意思是我總是可以用rU打開文件並創建一個新文件並將行附加到它上面,在原始文件中爲2行創建1行。非常感謝。 –

+0

@dqr:我不確定我瞭解你的後續行動,但我會嘗試更新答案。 – abarnert