导入 CSV 文件时 Python 3 中的 UnicodeDecodeError
Posted
技术标签:
【中文标题】导入 CSV 文件时 Python 3 中的 UnicodeDecodeError【英文标题】:UnicodeDecodeError in Python 3 when importing a CSV file 【发布时间】:2012-09-26 23:13:24 【问题描述】:我正在尝试使用以下代码导入 CSV:
import csv
import sys
def load_csv(filename):
# Open file for reading
file = open(filename, 'r')
# Read in file
return csv.reader(file, delimiter=',', quotechar='\n')
def main(argv):
csv_file = load_csv("myfile.csv")
for item in csv_file:
print(item)
if __name__ == "__main__":
main(sys.argv[1:])
这是我的 csv 文件的示例:
foo,bar,test,1,2
this,wont,work,because,α
还有错误:
Traceback (most recent call last):
File "test.py", line 22, in <module>
main(sys.argv[1:])
File "test.py", line 18, in main
for item in csv_file:
File "/usr/lib/python3.2/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 40: ordinal not in range(128)
显然,它在 CSV 结尾处击中字符并抛出该错误,但我不知道如何解决这个问题。有什么帮助吗?
这是:
Python 3.2.3 (default, Apr 23 2012, 23:35:30)
[GCC 4.7.0 20120414 (prerelease)] on linux2
【问题讨论】:
【参考方案1】:看来你的问题归结为:
print("α")
你可以通过指定PYTHONIOENCODING
来修复它:
$ PYTHONIOENCODING=utf-8 python3 test.py > output.txt
注意:
$ python3 test.py
如果您的终端配置支持它应该按原样工作,其中test.py
:
import csv
with open('myfile.csv', newline='', encoding='utf-8') as file:
for row in csv.reader(file):
print(row)
如果open()
上面没有encoding
参数,那么您将得到UnicodeDecodeError
和LC_ALL=C
。
同样使用LC_ALL=C
,即使没有重定向,您也会得到UnicodeEncodeError
,即在这种情况下需要PYTHONIOENCODING
(在PEP 538: Legacy C Locale Coercion 在Python 3.7+ 中实现之前)。
【讨论】:
【参考方案2】:从python docs,您必须设置文件的编码。以下是该网站的示例:
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
编辑:您的问题似乎与打印有关。尝试使用漂亮的打印机:
import csv
import pprint
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
pprint.pprint(row)
【讨论】:
设置文件的编码并不能解决问题...file = open(filename, 'r', encoding='utf-8')
仍然给我UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 40: ordinal not in range(128)
啊,这与print
无法显示Unicode 字符有关。 Quora 上的这个问题可能有答案——它使用漂亮的打印机:quora.com/How-do-you-print-a-python-unicode-data-structure
我认为该错误与打印完全无关。它在 for 循环开始时遇到错误,甚至在 print() 运行之前。您使用 pprint 编辑的示例代码产生与以前相同的错误,进一步强化了这一说法。我被难住了。
export PYTHONIOENCODING=utf-8
解决了我的问题。
@betaRepeating "export PYTHONIOENCODING=utf-8 解决了我的问题。"你能进一步解释一下吗?【参考方案3】:
另一种选择是通过传递错误处理程序来掩盖错误:
with open('some.csv', newline='', errors='replace') as f:
reader = csv.reader(f)
for row in reader:
print(row)
它将用“缺失字符”替换文件中任何不可解码的字节。
【讨论】:
以上是关于导入 CSV 文件时 Python 3 中的 UnicodeDecodeError的主要内容,如果未能解决你的问题,请参考以下文章