2016-11-05 146 views
0

我試圖編寫一個列表到txt文件,編碼utf-8沒有BOM。但有一個問題是: 如果我創建使用UTF-8文件withou BOM編碼:將列表寫入文件txt(utf-8)

ポ 
    1 
    田 
    11 
    直 
    11 
    子 
    11 

,用我的功能來讀給一個列表:

import codecs 
def file_to_list(file_name): 
    results = [] 
    f = codecs.open(file_name, encoding='utf-8') 
    for line in f: 
     results.append(line.replace('\r\n', '')) 
    return results 
list_1 = file_to_list('test_read.txt') 
print(list_1) 

我得到的確定結果:['ポ', '1', '田', '11', '直', '11', '子', '11'] 但畢竟這我用另一個函數寫回再次文件並讀取該文件,一個問題出現:

def list_to_file(file_name, thelist): 
    f = codecs.open(file_name, "w", encoding='utf-8') 
    for item in thelist: 
     f.write("%s\n" % item) 
list_to_file('test_read.txt', list_1) 
list_2 = file_to_list('test_read.txt') 
print(list_2) 

的返回的打印是:['ポ\n', '1\n', '田\n', '11\n', '直\n', '11\n', '子\n', '11\n'] 那麼,製作'\n'有什麼不好?

+1

'line.replace( '\ r \ n',' '')不會觸及'list_to_file'所寫的普通''n''字節。順便說一句,你應該總是提到帶有Unicode問題的Python版本,因爲Py2和Py3在Unicode處理方面有很大的不同。此外,UTF-8編碼的文件應該從BOM開始,除非您需要使用一些破碎的軟件。 –

+0

@ PM2Ring你能教我如何去除它嗎? – AlphaWolf

+0

你應該嘗試摩西的回答!您可能會發現這篇文章有用:[Pragmatic Unicode](http://nedbatchelder.com/text/unipain.html),它由SO老將Ned Batchelder編寫。 –

回答

2

您不應該更換尾隨空白/新行字符,因爲它們可能在不同的平臺上有所不同。你應該他們。更重要的是,您只需寫入文件\n,但您的函數預計\r\n

在你file_to_list功能,取代:

results.append(line.replace('\r\n', '')) 

results.append(line.rstrip()) 

參見:

>>> 'some line\n'.replace('\r\n', '') 
'some line\n' 
+0

它工作完美,謝謝! – AlphaWolf