2017-06-12 49 views
2

H! 此問題涉及字符串和編碼。 我有一個文件 'build_list.txt':python encoding utf'Miały'不等於'Miały'

Miały password 
something not important 
stuff stuff 
stuff 

和閱讀file.py:

import csv 

with open('build_list.txt', 'r', encoding='utf-8') as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') 

    for i, row in enumerate(spamreader): 
     if i == 0: 
      username = str(row[0]).strip() 
      password = str(row[1]).strip() 
      if username != "Miały": 
       print("FAIL: {!r} != {!r}".format(
        username.encode('utf-8'), "Miały".encode('utf-8'))) 

它打印

FAIL: b'\xef\xbb\xbfMia\xc5\x82y' != b'Mia\xc5\x82y' 

爲什麼是這樣的,以及如何解決它?

我使用pycharm,節省使用UTF-8編碼的窗戶txt文件(ANSI產生奇怪的字符)

回答

3

CSV文件有一個無形的byte order mark在其開始,這是越來越被視爲第一部分記錄在文件中。 UTF-8-encoded text files aren't supposed to have byte order marks,但Windows程序有插入它們的壞習慣。你可以使Python忽略BOM通過與utf-8-sig編碼打開,而不是簡單的UTF-8的文件:

with open('build_list.txt', 'rt', encoding='utf-8-sig') as csvfile: 
    # ... 

但當文件不使用該編碼,除非你有一個互操作程序無法將文件識別爲沒有字節順序標記的UTF-8。

+0

FAIL:b'\ xef \ xbb \ xbfMa \ xc5 \ x82y'!= b'Mia \ xc5 \ x82y' –

+0

啊哈!字節順序標記再次打擊。你能否在你的問題中編輯這個問題,而我重寫我的答案以便真正回答? – zwol

+0

hm?你能指點我解決嗎? :> //缺少大括號if(row [0] ==「Miały」): –

2

這是因爲你在Miały使用Unicode,

  1. from __future__ import unicode_literals

  2. 使用print(username == u'Miały')

看一看this link以及被如何使用Unicode格式。

UPDATE:

測試代碼後,我得到了True,沒有錯誤。

+0

仍然產生錯誤 –

+0

我測試了你的代碼,沒有編輯,然後我沒有添加unicode支持就得到了'True',你能否確認你運行的代碼是否與你粘貼的代碼相同? –

+0

@SadeghAlirezaie問題是OP的實際文本文件中不可見的字符;複製和粘貼問題不會重現問題。 – zwol