我想在每行/行的中間有^ M字符的python中,它是一個換行符的csv文件。我無法以'rU'以外的任何模式打開文件。從csv文件中刪除換行
如果我在'rU'模式下打開文件,它會讀入換行符並分割文件(創建一個換行符)並給出兩倍的行數。
我想完全刪除換行符。怎麼樣?
我想在每行/行的中間有^ M字符的python中,它是一個換行符的csv文件。我無法以'rU'以外的任何模式打開文件。從csv文件中刪除換行
如果我在'rU'模式下打開文件,它會讀入換行符並分割文件(創建一個換行符)並給出兩倍的行數。
我想完全刪除換行符。怎麼樣?
需要注意的是,爲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.
所以,你可以隨時遞給你reader
或DictReader
之前貼在文件過濾器。取而代之的是:
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的以外? sed
,tr
,許多文本編輯器等都可以爲您做到這一點。這裏有一個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 –
我想我想永久修改文件而不是過濾它。你的代碼將它過濾掉,但是有沒有辦法打開這個文件,然後刪除^ M並關閉它,從而永久修改它?例如在上面的例子中,一旦我打印行,我確實看到換行符。不知道我缺少什麼。我的意思是我總是可以用rU打開文件並創建一個新文件並將行附加到它上面,在原始文件中爲2行創建1行。非常感謝。 –
@dqr:我不確定我瞭解你的後續行動,但我會嘗試更新答案。 – abarnert
'dos2unix'是你想要的。 – squiguy