【问题标题】:Opening a text file, and receiving a encoding error, tried multiple methods no hope打开一个文本文件,收到一个编码错误,尝试了多种方法没有希望
【发布时间】:2018-09-15 14:20:03
【问题描述】:

我正在尝试打开一个密码数据库文件(由一堆常用密码组成),但出现以下错误:

到目前为止的尝试.. 代码:

f = open("crackstation-human-only.txt", 'r')

for i in f:
    print(i)

错误代码:

Traceback (most recent call last):
  File "C:\Users\David\eclipse-workspace\Kaplin\password_cracker.py", line 3, in <module>
    for i in f:
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 753: character maps to <undefined>

在做了一些研究之后,我被告知尝试encoding = 'utf-8',后来我发现这基本上是在猜测并希望文件会显示所有输出

代码:

f = open("crackstation-human-only.txt", 'r', encoding = 'utf-8')

for i in f:
    print(i)

错误:

Traceback (most recent call last):
  File "C:\Users\David\eclipse-workspace\Kaplin\password_cracker.py", line 3, in <module>
    for i in f:
  File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe4 in position 5884: invalid continuation byte

收到此错误消息后,建议我尝试下载类似'Sublime Text 3'的文本编辑器,并打开控制台端输入命令'Encoding()',但不幸的是无法检测到编码。

我的教授能够使用 bash 来“grep cat”文件中的行(老实说,我对 bash 知之甚少,所以如果其他人知道这些术语,我不确定这是否会帮助他们)

如果有人对我可以做些什么来解决这个问题有任何建议,我将不胜感激。

如果有人有兴趣查看文件中的字符类型,我将发布文本文档的链接。

Link to the file, it's a .txt from my school/professors domain

更新:

我有一个运行基本操作系统的同学,他正在使用终端编写他的 python 程序,该程序将遍历文件,并且他使用编码“latin-1”,他能够输出更多字符比我,我在 Windows 10 上,对我的所有脚本都使用 Eclipse-atom。

所以似乎有些东西导致我可能无法根据这些因素获得正确的输出,我猜是因为根据结果看起来就是这样,

我将安装elementary-os 并尝试那里的所有解决方案,看看我是否可以解决这个文件。我会尽快添加另一个更新!

【问题讨论】:

  • 你应该在打开文件后读取它,比如f.read(),否则你正在尝试读取file实例。
  • 有一个编码自动检测工具。试试看:pypi.org/project/chardet
  • 尝试使用f.read()f.readlines() 阅读。您实际上是在尝试从文件实例中获取元素,而不是从实例中的数据。
  • 您是否尝试过像'latin-1' 这样的不同编码?如果charmaputf-8 都失败了,那么你应该尝试不同的...

标签: python python-3.x character-encoding


【解决方案1】:

前段时间遇到过类似的问题,更多时候我发现设置

encoding = 'raw_unicode_escape'

对我有用

对于您的特殊情况,我尝试了所有 Python 3 支持的编码类型并发现

  • raw_unicode_escape
  • mbcs
  • 棕榈树

尝试以上任一方法来读取您的文件

f = open("crackstation-human-only.txt", 'r', encoding = 'mbcs')

有关编码的更多信息,请参阅https://docs.python.org/2.4/lib/standard-encodings.html

希望这会有所帮助。

回复: 通过上面的链接,我列出了要在您的文件上尝试的编码格式。我没有保存我以前的工作,这更详细,但是这段代码应该做同样的事情。我现在重新运行它如下:

enc_list = ['big5big5-tw,',
 'cp037IBM037,',
 'cp437437,',
 'cp737Greek',
 'cp850850,',
 'cp855855,',
 'cp857857,',
 'cp861861,',
 'cp863863,',
 'cp865865,',
 'cp869869,',
 'cp875Greek',
 'cp949949,',
 'cp1006Urdu',
 'cp1140ibm1140Western',
 'cp1251windows-1251Bulgarian,',
 'cp1253windows-1253Greek',
 'cp1255windows-1255Hebrew',
 'cp1257windows-1257Baltic',
 'euc_jpeucjp,',
 'euc_jisx0213eucjisx0213Japanese',
 'gb2312chinese,',
 'gb18030gb18030-2000Unified',
 'iso2022_jpcsiso2022jp,',
 'iso2022_jp_2iso2022jp-2,',
 'iso2022_jp_3iso2022jp-3,',
 'iso2022_krcsiso2022kr,',
 'iso8859_2iso-8859-2,',
 'iso8859_4iso-8859-4,',
 'iso8859_6iso-8859-6,',
 'iso8859_8iso-8859-8,',
 'iso8859_10iso-8859-10',
 'iso8859_14iso-8859-14,',
 'johabcp1361,',
 'koi8_uUkrainian',
 'mac_greekmacgreekGreek',
 'mac_latin2maclatin2,',
 'mac_turkishmacturkishTurkish',
 'shift_jiscsshiftjis,',
 'shift_jisx0213shiftjisx0213,',
 'utf_16_beUTF-16BEall',
 'utf_16_le',
 'utf_7',
 'utf_8',
 'base64_codec',
 'bz2_codec',
 'hex_codec',
 'idna',
 'mbcs',
 'palmos',
 'punycode',
 'quopri_codec',
 'raw_unicode_escape',
 'rot_13',
 'string_escape',
 'undefined',
 'unicode_escape',
 'unicode_internal',
 'uu_codec',
 'zlib_codec'
 ]

for encode in enc_list: 
    try:
        with open(r"crackstation-human-only.txt", encoding=encode) as f:
            temp = len(f.read())
    except:
        enc_list.remove(encode)

print(enc_list)     

在您的机器上运行此代码,您将获得可以在文件上尝试的编码列表。我收到的输出是

['cp037IBM037,', 'cp737Greek', 'cp855855,', 'cp861861,', 'cp865865,', 'cp875Greek', 'cp1006Urdu', 'cp1251windows-1251Bulgarian,', 'cp1255windows-1255Hebrew', 'euc_jpeucjp,', 'gb2312chinese,', 'iso2022_jpcsiso2022jp,', 'iso2022_jp_3iso2022jp-3,', 'iso8859_2iso-8859-2,', 'iso8859_6iso-8859-6,', 'iso8859_10iso-8859-10', 'johabcp1361,', 'mac_greekmacgreekGreek', 'mac_turkishmacturkishTurkish', 'shift_jisx0213shiftjisx0213,', 'utf_16_le', 'utf_8', 'bz2_codec', 'idna', 'mbcs', 'palmos', 'quopri_codec', 'raw_unicode_escape', 'string_escape', 'unicode_escape', 'uu_codec']

【讨论】:

  • 我尝试了所有 3 个不幸的是我现在收到以下错误
  • Traceback(最近一次调用最后):文件“C:\Users\David\eclipse-workspace\Kaplin\password_cracker.py”,第 3 行,在 print(f) 文件“C :\Users\David\AppData\Local\Programs\Python\Python37\lib\encodings\cp1252.py",第 19 行,在编码返回 codecs.charmap_encode(input,self.errors,encoding_table)[0] UnicodeEncodeError: 'charmap ' 编解码器无法对位置 135620 中的字符 '\x81' 进行编码:字符映射到
  • 是否可以设置一个 ErrorHandler 以在编码失败的情况下尝试使用不同的编码?例如,当我从 encoding = 'utf-8' 获得未定义的字符映射时,尝试 encoding = 'latin-1' 或在 for 循环中类似的东西,或者这是不可能的
  • 我尝试了完全相同的方法,以找到这三种编码。我再次运行脚本打印文件的每一行。我没有遇到任何错误。但是,您可以捕获错误并可能将不可读的行存储在另一个文件中。然后在脚本遍历整个 683 MB 文件后尝试其他编码类型。
  • 你能更新你的代码来告诉我你做了什么吗,我对你是怎么做到的感到困惑。您是否只是使用 3 种编码运行以下代码 3 次?或者您能否让它们在文件的一次迭代中同时运行,您能否澄清一下,(我再次对 python/编程非常陌生,所以如果您能解释一下您做了什么,我将不胜感激。)
【解决方案2】:

里面确实有一些有趣的角色。即使您的代码对我有用,我还是建议使用 try/except 块来捕获系统无法处理的行并跳过它们:

with open("crackstation-human-only.txt", 'r') as f:
    for i in f:
        try:
            print(i)
        except UnicodeDecodeError:
            continue

或者,尝试将open

一起使用
  • 二进制读取模式'rb'而不是'r'
  • errors='replace' 参数,但这不会达到你想要的效果。

open documentation

【讨论】:

  • 唯一的事情是我需要通过哈希函数运行每个密码,以便与我的教授提供的密码文件进行比较,所以我需要每个可能的密码,我我真的很好奇代码如何能够完全通过你的机器运行,有些人甚至建议我在 'r' 之后这样做(编码 = 'ignore'),更糟糕的情况是我会攻击我的教授 :)
  • 刚刚尝试了您的代码,所以在尝试 encoding = 'utf-8' 之前我仍然遇到错误
  • Traceback(最近一次调用最后一次):文件“C:\Users\David\eclipse-workspace\Kaplin\password_cracker.py”,第 2 行,在 中 for i in f: File“ C:\Users\David\AppData\Local\Programs\Python\Python37\lib\encodings\cp1252.py",第 23 行,在解码返回 codecs.charmap_decode(input,self.errors,decoding_table)[0] UnicodeDecodeError: ' charmap' 编解码器无法解码位置 753 中的字节 0x81:字符映射到
  • 老实说,我已经使用 python 玩了大约 2 个月左右,我仍在学习过程中(请与我裸露:D),我的问题:是可能我的计算机上没有安装字符包,这会导致这个或与 python 无关 lol
  • 这很奇怪,因为我也在使用 UTF-8.. 我已经用其他一些建议更新了我的答案
猜你喜欢
  • 2016-10-29
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多