【问题标题】:Cannot convert all elements of csv file to python objects无法将 csv 文件的所有元素转换为 python 对象
【发布时间】:2019-01-31 08:18:12
【问题描述】:

我正在尝试使用以下 python 脚本将所有 CSV 元素转换为 python 对象,但并非 CSV 文件中的所有字符都是 UTF-8,我必须将所有这些字符转换为可读格式,即 UTF-8。我怎样才能做到这一点?

我尝试使用简单的文本编辑器将 csv 文件转换为 UTF-8,就像 How to convert csv files encoding to utf-8 一样,但无能为力。

我正在使用以下 python 文件:

import csv 

filename = "file.csv"

rows = [] 

with open(filename, 'r') as csvfile: 
    csvreader = csv.reader(csvfile) 

    for row in csvreader: 
        rows.append(row) 

    print("Total no. of rows: %d"%(csvreader.line_num)) 

print('\nFirst 5 rows are:\n') 
for row in rows[:5]: 
    for col in row: 
        print("%10s"%col), 
    print('\n') 

Python 产生以下错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa4 in position 4942: invalid start byte

【问题讨论】:

  • 你可以试试:open(filename, 'r',encoding='utf-16') 吗?
  • 错误提示文件不是utf8编码的。您是否知道实际的编码,或者您是否需要一种不会中断但会给出奇怪字符的 catch all 方式?
  • @ArtemTrunov UnicodeError: UTF-16 流不以 BOM 开头
  • @SergeBallesta 我不知道是哪种编码。

标签: python csv utf-8


【解决方案1】:

UTF-8 现在是事实上的标准,因为 if 可以表示任何 unicode 字符,但出于兼容性原因,许多系统(主要是 Windows)仍然使用其他编码。例如,对于西欧语言,Windows 使用 cp1252,它是 Latin1 的变体。

Latin1 是一种有趣的编码,因为任何字节在 Latin1 中都是有效的,并且代表相同代码点的 unicode 字符。因此,当您想要进行防弹解码并且不确定实际编码时,可以使用 编码。简单来说,如果编码不同,您将读取 weird 个字符。例如,这个 utf-8 编码字符串“fête”(法语为 fest)会将 'fête' 读取为 Latin1 编码字节字符串。

所以这不会中断(但可能会给出不正确的字符):

...
with open(filename, 'r', encoding='Latin1') as csvfile: 
    csvreader = csv.reader(csvfile)
...

【讨论】:

    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 2019-11-24
    • 2016-02-08
    • 2019-02-02
    • 2018-06-06
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多