2017-06-12 35 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