错误:“'ascii'编解码器无法解码Python 3中的字节0xd8”

时间:2015-12-04 18:40:50

标签: python unicode utf-8 python-3.3

我编写了一个程序,以递归方式搜索文件夹中具有特定扩展名的文件并进行一些处理。奇怪的是,该程序运行良好,大约有85个文件,然后每次都在同一个文件上崩溃。我认为该文件或文件名没有任何不同。因为它可以运行85个文件,我知道错误不是关于我的代码本身,但更多关于错误的编译器可能吗?

操作系统:Linux arctic 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u1 x86_64 GNU/Linux

错误详情(完整回溯):

Traceback (most recent call last):
  File "scoretotal.py", line 98, in <module>
    main()   
  File "scoretotal.py", line 96, in main
    find_score_files()
  File "scoretotal.py", line 89, in find_score_files
    total = calculate_total((os.path.join(root,filename)))
  File "scoretotal.py", line 14, in calculate_total
    lines = file_object_read.read()
  File    "/soft/linux/bin/../python3.3.3/lib/python3.3/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd8 in position 17: ordinal not in range(128)

我正在运行Python 3.3.3。从我的网上研究来看,它可能与unicode或UTF-8格式有关,但对于我的生活,我无法弄明白。出了什么问题?

2 个答案:

答案 0 :(得分:4)

当您在未指定编码的情况下打开文件时,Python会为您选择一个;在你的情况下,它选择ascii,这是相当安全的,因为它不太可能给你错误的字符,但很容易遇到错误。您需要检查这些文件的来源以查找其编码并将其包含在open调用中。例如,如果您确定文件是使用ISO-8859-1编码编写的:

file_object_read = open(path, 'r', encoding='iso-8859-1')

如果您知道要使用哪种编码,您必须猜测,并接受有时您的猜测是错误的。在Linux上,您可以尝试'utf-8',在Windows上可以尝试'mbcs',因为这些是这些系统上其他程序使用的默认值。有些实用程序可以检查文件内容并尝试进行有根据的猜测,包括chardet package

答案 1 :(得分:0)

您是否熟悉&#39;之间的区别?和'或&#34;并且“......这些(我称之为)漂亮的报价往往会毁掉蟒蛇日。

它可能不是这个,但肯定与文件中的字符集有关。如下所示:http://effbot.org/pyfaq/what-does-unicodeerror-ascii-decoding-encoding-error-ordinal-not-in-range-128-mean.htm

我会推荐一个try catch,除了错误并转换为ascii。