Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,从文件中读取特殊单词_Python_Python 2.7_Encoding - Fatal编程技术网

Python,从文件中读取特殊单词

Python,从文件中读取特殊单词,python,python-2.7,encoding,Python,Python 2.7,Encoding,所以我有一个文本文件中的单词列表,我没有生成文本文件,所以我不知道文件编码 名单如下: 记事本++告诉我它是ANSI 运行此脚本(reader1.py)时: 单词piirilä在控制台中显示为piirilõ,但在新文件中存储为piirilä 我想知道的是,如果我计算变量单词的hash256,它会在piirilä或piirilõ上运行它吗 word=word.decode('cp-1252')引发异常 谢谢 PS:Windows 8.1 64位,python 2.7 64位 编辑 在做了更多的小提

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

名单如下:

记事本++告诉我它是ANSI

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

单词
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
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
我在reader1.py中添加了
hashlib.sha256(word.hexdigest()

然后输出以下内容:

piirilä
278394edd22799ae29bc881dc66e45e45a9a18972c45a35208b6a3d71e209a10
piiril├Á
7e158cf465d3afadd865684f979f46a5282ef93127c150b55273801086fa3c09
Whatitis
d338e8077b6c9d3d2f09e4e2d4a2a5f52152b72e9b6bb5c456a67f63d853e75f
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个不同的哈希值,哪一个是我想要的?

查看了您的文本文件

linux文件命令告诉我它的字符集是ISO-8859文本(,带有CRLF行终止符)。也许这就是你

word = word.decode('cp-1252') 
提出了一个例外

看一看,这是关于确定python中文本文件的编码的

最好的, 我

我计算变量单词的hash256,它会在
piirilä
piirilõ
上运行它吗

哈希将不会在任何一个上运行它将在变量中的字节序列上运行,该变量的最后一个字节表示一种编码中的
õ
,另一种编码中的
ä
。显然,您的控制台的默认编码与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
,并且可能会发生各种令人困惑的事情。切换到Python3会使您不必处理所有这些问题。

我强烈建议您在Python3中再试一次,以便我们能够以合理的方式诊断和修复问题。我极力推荐这一点;使用Python2学习编码会带来不必要的痛苦。等等,那么用latin1和utf8编码的“toto”将不会产生相同的哈希256?不,它们将产生相同的哈希。“toto”是ascii码(除非你偷偷地在一个有趣的字符)。utf8和latin1都是设计成ascii的超集,所以ascii字符的编码是相同的。(所有8位ISO-8859编码都是ascii的超集;latin1就是其中之一)。这就是为什么在处理英文文本时通常可以忽略编码的原因。一个限定条件是:如果在Windows上使用文本编辑器将“toto”保存到utf-8格式的文件中,Windows喜欢插入“字节顺序标记”(实际上不需要,并且与Unicode建议相反),Python 2会将其作为字符串的一部分读取,它会影响散列。但是实际的字符串“toto”,例如在Python文本中,在utf-8中只有四个ascii字节。