2016-08-12 89 views
0

我最近開始了作爲ETL開發人員的工作,並且作爲練習的一部分,我從包含原始數據的文本文件中提取數據。我的原始數據如圖所示。 My Raw Data使用python將分隔符添加到文本文件

現在我想爲我的數據文件添加分隔符。基本上在每行之後,我想添加一個逗號(,)。我在Python中的代碼看起來像這樣。

with open ('new_locations.txt', 'w') as output: 
with open('locations.txt', 'r') as input: 
    for line in input: 
     new_line = line+',' 
     output.write(new_line) 

其中new_locations.txt是輸出文本文件,locations.txt是原始數據。

但是,它一直拋出錯誤。

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 3724: character maps to

我究竟在哪裏出錯?

Note: The characters in raw data are not all ASCII characters. Some are Latin characters as well.

+0

你能讀取沒有這些錯誤的整個文件嗎? –

+0

@DanielLee不,我無法閱讀整個文件。我只能讀取它直到出現ASCII字符。一旦其他角色開始,他們會拋出一個錯誤。 –

回答

1

當您在「文本」模式打開在Python 3文件,然後閱讀和書寫內容轉換字節的文件到Python(Unicode)的字符串英寸默認編碼是平臺相關的,但通常是UTF-8。

如果文件使用Latin-1編碼,你應該

with open('locations.txt', 'r', encoding='latin_1') as input 

打開你或許應該也和輸出,如果你想輸出也將在Latin-1的做到這一點。

從長遠來看,您應該考慮將所有數據轉換爲數據文件中的unicode格式。

+0

感謝您的回答。這真的起作用了。 –

0

所以當你寫入文件時,你需要在寫入之前對它進行編碼。如果你谷歌,你會發現噸的結果。

這裏是如何可以做到:

output.write(new_line.encode('utf-8'))# or ascii 

您也可以要求忽略不能轉換但西港島線造成charachter的損失和可能不是所期望的輸出,這裏是怎麼說將做到:

output.write(new_line.encode('ascii','ignore'))# or 'utf-8' 
+0

嘿謝謝你的答案。不過,我有一個跟進問題。 'utf-8'不適合我。 '拉丁-1'做到了。現在原始數據可以是不同字符的混合。如何使這個完全通用?我不想在任何角色之間進行區分。 –

+0

所以拉丁-1編碼將對utf-8或ascii不支持的charachter有額外的支持,它不會將所有char都更改爲latin-1,而僅僅是那些不支持的。上面的詹姆斯有一個更好的方式來實現我的建議。 – harshil9968

相關問題