我编写了一个程序,以递归方式搜索文件夹中具有特定扩展名的文件并进行一些处理。奇怪的是,该程序运行良好,大约有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格式有关,但对于我的生活,我无法弄明白。出了什么问题?
答案 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。