【问题标题】:UnicodeDecodeError with processing a csv处理 csv 的 UnicodeDecodeError
【发布时间】:2019-10-02 20:31:48
【问题描述】:

我昨天工作的代码中突然出现“UnicodeDecodeError”。

文件 “D:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py”,行 3284,在运行代码中 self.showtraceback(running_compiled_code=True)

文件 “D:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py”,行 2021 年,在 showtraceback 中 值, tb, tb_offset=tb_offset)

文件“D:\Anaconda\lib\site-packages\IPython\core\ultratb.py”,行 第1379章 self, etype, value, tb, tb_offset, number_of_lines_of_context)

文件“D:\Anaconda\lib\site-packages\IPython\core\ultratb.py”,行 第1291章 elist = self._extract_tb(tb)

文件“D:\Anaconda\lib\site-packages\IPython\core\ultratb.py”,行 第1272章 返回 traceback.extract_tb(tb)

文件“D:\Anaconda\lib\traceback.py”,第 72 行,在 extract_tb 中 return StackSummary.extract(walk_tb(tb), limit=limit)

文件“D:\Anaconda\lib\traceback.py”,第 364 行,摘录 f.line

文件“D:\Anaconda\lib\traceback.py”,第 286 行,行 self._line = linecache.getline(self.filename, self.lineno).strip()

文件“D:\Anaconda\lib\linecache.py”,第 16 行,在 getline lines = getlines(filename, module_globals)

文件“D:\Anaconda\lib\linecache.py”,第 47 行,在 getlines return updatecache(filename, module_globals)

文件“D:\Anaconda\lib\linecache.py”,第 137 行,在 updatecache 中 行 = fp.readlines()

文件“D:\Anaconda\lib\codecs.py”,第 321 行,解码中 (结果,消耗) = self._buffer_decode(data, self.errors, final)

UnicodeDecodeError: 'utf-8' 编解码器无法解码位置 0xf6 字节 2441: 无效的起始字节

import csv
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

dateiname_TDM = "./TDM_example_small.csv" 
dateiname_corpus = "./Topic_Modeling/Input_Data/corpus.mm" 
dateiname_dictionary = "./Topic_Modeling/Input_Data/dictionary.dict"

ids = {}
corpus = []

with open(dateiname_TDM, newline='') as csvfile:
    reader = csv.reader(csvfile, delimiter=';', quotechar='|') 
    documente = next(reader, None)[1:]
    for rownumber, row in enumerate(reader): 
        for index, field in enumerate(row):
            if index == 0:
                if rownumber > 0:
                    ids[rownumber-1] = field 
            else:
                if rownumber == 0:
                    corpus.append([])
                else:
                    try:
                        if field > 0:
                            corpus[index-1].append((rownumber-1, int(field)))
                    except ValueError:
                        corpus[index-1].append((rownumber-1, 0))

【问题讨论】:

  • 如果您的代码自昨天以来没有更改,则可能是输入数据已更改。显然您现在正在阅读的 CSV 文件不是用 UTF-8 编码的,但可能是一些 8 位字符集(例如 CP1252)。还请查看this post,解释这是如何不够充分的信息(我们需要知道您认为byte 0xf6 应该被解释为 - “ö”吗?)。

标签: arrays python-3.x list csv unicode


【解决方案1】:

没有看到位置 2441 的内容我不完全确定,但它可能是以下之一:

  • 一个特殊的非 ascii/扩展 ascii 字符,在这种情况下执行 the_string.encode("UTF-8") 或在 open 函数中打开时执行 encoding = "UTF-8"
  • 您在某处有 \u\U,这使得下一个字符被读取为 Unicode 序列的一部分,所以 repr(the_string) 添加反斜杠以在之后(可能不是这个)取消反斜杠
  • 您正在阅读bytes 对象而不是str 对象。尝试在open 函数中使用r+b(读写,字节)打开它

我或多或少地把意大利面扔到了墙上,但我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2018-10-24
    相关资源
    最近更新 更多