Python,从文件中读取特殊字

时间:2017-12-06 10:43:01

标签: python python-2.7 encoding

所以我在文本文件中有这个单词列表,我没有生成文本文件所以我不知道文件编码。

列表:http://s000.tinyupload.com/?file_id=31195244104486221180

Notepad ++告诉我它是ANSI。

运行此脚本时(reader1.py):

if __name__ == '__main__':
    words = open("test_list.txt").read().splitlines()
    for word in words:
        print word
        with open("test_list-rewrite.txt", "a") as myfile:
                myfile.write(word + '\n')

单词piirilä在控制台中显示为piirilõ,但在新文件中,它存储为piirilä

我想知道的是,如果我计算变量字的hash256,它会在piirilä还是piirilõ上运行?

word = word.decode('cp-1252')提出异常

由于

PS:Windows 8.1 64位,python 2.7 64位

修改

经过一些更多的愚蠢之后,我发现了一些奇怪的东西,制作了这个

#!/usr/bin/env python
# --*-- encoding: utf-8 --*--

import hashlib

word1 = 'piirilä'
word2 = 'piirilõ'
word3 = 'Whatitis'

print word1
print hashlib.sha256(word1).hexdigest()
print word2
print hashlib.sha256(word2).hexdigest()
print word3
print hashlib.sha256(word3).hexdigest()

输出:

piirilä
278394edd22799ae29bc881dc66e45e45a9a18972c45a35208b6a3d71e209a10
piiril├Á
7e158cf465d3afadd865684f979f46a5282ef93127c150b55273801086fa3c09
Whatitis
d338e8077b6c9d3d2f09e4e2d4a2a5f52152b72e9b6bb5c456a67f63d853e75f

我将hashlib.sha256(word).hexdigest()添加到reader1.py

然后输出:

billycorgan
d94a3821ad2b6d26aedf4db13b551d9e0eefeaf92d0615946cdc0215ec974692
brescos64
8840d0e40a83d711ce0b44ed66a5d1e4df06fbf6c5c168e98af4775c6e19f52b
matvois
ef5e930806489e8fcc8e0746ce5f8cb4c6715a56d2fd73d42b1c711b5e71474f
kbeans
c207d8366f3dbae64357088dee8eeeb35a047b2e021342c82aa0bd8c15753d74
Whatitis
d338e8077b6c9d3d2f09e4e2d4a2a5f52152b72e9b6bb5c456a67f63d853e75f
cphu
1427ebcff066a5386d0649842fb60b014bebfc5a1589896a62488865e8f06c50
de'mystifierait
83665461f98de4c270e6a4d69a445ea2f9079693824c0544a9add4caee5c7dd2
wendelboe
1423bf5d682dafdc72937d92811b5ff9d856681e94204d565cb0f29b809f5e13
ketanshah
f9977718f33f9068f20c52321ef02be3611e7c7a0aebb59421e74f864c259f53
piirilõ
a238ede50bc349279c62399b275cfa3271f63bc5e7499cc40aaa4ff84198666d
gasoline
4325ed4bef2a2a10c97cbb8235f822602efc0f04a900f0eb537f8e9fee9728aa
BabyBlues
8168fce33124ecec74e647f119de5b3cda795dcc69c4237d8cf27b10aca07b94

所以我得到3个不同的哈希值,其中一个是我想要的哈希值?

2 个答案:

答案 0 :(得分:1)

查看了你的文本文件。

linux file命令告诉我它的charset是ISO-8859文本(带有CRLF行终止符)。所以可能就是那个为什么你的

word = word.decode('cp-1252') 

提出异常。

看一下Determine the encoding of text in Python,它是关于在python中确定文本文件的编码。

最佳, 我

答案 1 :(得分:0)

  

我计算变量字的hash256,它会在piirilä还是piirilõ上运行?

哈希不会在任何一个上运行; 它将在您的变量中的 bytes 序列上运行,其最后一个字节代表一个编码中的õ和一个不同编码中的ä 。显然,您的控制台具有与Notepad ++不同的默认编码,因此您会看到以不同方式显示的相同字节

您的测试脚本包含utf-8编码文本,这是另一个字节序列(每个重音字符有两个字节,这就是为什么您在输出中看到两个有趣符号的原因;或者尝试打印repr(word1))。如果您想知道文件中存储的单词的哈希值,请编写一个从文件中读取 的程序并计算其哈希值。

您问题的真正解决方案是切换到Python 3 。然后,您就可以运行此代码:

words = open("test_list.txt", encoding="latin1").read().splitlines()
for word in words:
    print(word)

然后你可以尝试不同的编码,直到找到正确的编码(在你的情况下," latin1"似乎正确)。在Python 2上,您可以在导入后执行相同的操作:

from codecs import open

但是,您将拥有unicode个字符串而不是str,并且可能会发生各种令人困惑的事情。切换到Python 3使得不必处理所有这些。