这里还有一些关于这个问题的其他问题,但到目前为止还没有解决我的问题.

我有一个很大的(40MB)CSV文件.文件的大部分以iso-8859-1(Latin1)编码,但一些条目(仅条目!)采用的是utf-8格式.

如果我试图打开使用utf-8编码的文件,python已经抛出了一个编码错误.如果我打开iso-8859-1中的文件,该文件是可以读取的,但是一些条目仍然是mojibake.

我try 了以下代码来在线修复问题,但显然我遗漏了一些东西,因为utf-8条目仍然是mojibake.


import os
import ftfy

# There are issues with file encoding with this file. Try to convert it to proper utf-8
sourceEncoding = "iso-8859-1"
targetEncoding = "utf-8"
sourceFileName = os.path.join(folder, file + config.CSV_EXTENSION)
targetFileName = os.path.join(folder, file + "_temp" + config.CSV_EXTENSION)

# input file
csvfile = open(sourceFileName, "r", encoding = sourceEncoding)
Lines = csvfile.readlines()
for line in Lines:
    line = ftfy.fix_encoding(line) 

# output stream
outfile = open(targetFileName, "w", encoding = targetEncoding) # Windows doesn't like utf8
outfile.writelines(Lines)

# close files
csvfile.close()
outfile.close()

os.remove(sourceFileName)
os.rename(targetFileName, sourceFileName)

我拥有的一个特定字符串如下所示:

Ãberarbeitung A6 Heft

我希望它看起来是这样的:

Überarbeitung A6 Heft

编辑:

一些澄清.

我假设文件中有一些编码问题,因为我知道CSV中的条目有两个不同的来源.大多数查询是通过在图形用户界面中键入值来实现的.一些值来自自己编写的脚本,天知道是什么编码.

如果我在VSCode中打开CSV,它会假定它是ISO-8859-1.但有些条目看起来像我上面提到的:

 Ãberarbeitung A6 Heft

如果我将编码更改为UTF-8,则此条目变为‘Right’:

Überarbeitung A6 Heft

但随后其他条目变得更糟:

Testdurchf�hrung

try 打开使用UTF-8编码的文件时,错误消息为:

Exception has occurred: UnicodeDecodeError
'utf-8' codec can't decode byte 0xe4 in position 56: invalid continuation byte

我将try 导入CSV二进制文件并对其进行线状解码.也许这能奏效.

推荐答案

您可以在二进制模式下读取并手动解码每一行:

def try_decode(b, encodings):
    for enc in encodings:
        try:
            return b.decode(enc)
        except UnicodeDecodeError:
            pass
    raise ValueError('no matching encoding!')

with open(YOUR_FILE, 'rb') as fp:
    for b in fp:
        line = try_decode(b, ['utf8', 'latin1'])

Python相关问答推荐

怎样才能将左边缘作为pandas.cut的标签?

从原始DF和计算的总和创建新的框架

按日期和组增量计算总价值

如何使用关键参数按列对Pandas rame进行排序

键盘.任务组

从Python调用GMP C函数时的分段错误和内存泄漏

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

在使用Guouti包的Python中运行MPP模型时内存不足

Python -根据另一个数据框中的列编辑和替换数据框中的列值

Python中MongoDB的BSON时间戳

在Pandas 日历中插入一行

根据条件将新值添加到下面的行或下面新创建的行中

TARete错误:类型对象任务没有属性模型'

为什么带有dropna=False的groupby会阻止后续的MultiIndex.dropna()工作?

从dict的列中分钟

log 1 p numpy的意外行为

计算组中唯一值的数量

如何请求使用Python将文件下载到带有登录名的门户网站?

OR—Tools CP SAT条件约束

根据列值添加时区