python - 找不到用于读取 csv 的正确编解码器
问题描述
我正在阅读一个 csv 文件,这是针对来自网络协议、十六进制字符和普通混合的一些痕迹。我正在尝试读取 .csv,并且尝试了几种编码:utf-8、cp1252、latin1...
对于latin1:
UnicodeEncodeError:“ascii”编解码器无法在位置 51 编码字符 u'\xb0':序数不在范围内(128)
对于utf-8:
UnicodeDecodeError:“utf8”编解码器无法解码位置 51 中的字节 0xb0:无效的起始字节
对于cp1252:
UnicodeEncodeError:“ascii”编解码器无法在位置 51 编码字符 u'\xb0':序数不在范围内(128)
使用的代码是:
df=pd.read_csv(file,sep='`',error_bad_lines=False,encoding='cp1252',names=colnames,quotechar='"')
我不是编码方面的大专家,但我想知道如何解决它。
找出我正在阅读的 csv 文件的当前编码?
是否有一个非常宽松的编解码器可以处理几乎所有内容?
谢谢。
解决方案
CSV 是一种文本格式;它并不适合存储任意二进制数据块。
为了解决您的直接问题,您可以指定´latin-1'
为编码。该编解码器的独特之处在于每个单字节字符对应完全相同的 Unicode 代码点。
但是请注意,如果您不小心,这很可能会产生各种mojibake 。您可能应该提取任何二进制数据,然后尽快将剩余字段解码为正确的 Unicode。这是一个用于 UTF-8 的简单纯 Python 片段,其中一个字段包含二进制文件。
with open(filename, encoding='latin-1') as input:
reader = csv.reader(input)
for row in reader:
binary = row[42].encode('latin-1')
newrow = []
for field in row:
newrow.append(field.encode('latin-1').decode('utf-8'))
newrow[42] = binary
# newrow is now decoded UTF-8 except field 42 which is a bytes object
推荐阅读
- vue.js - SSR Nuxt 应用和本地存储使用
- ios - 在 iOS 上使 Xamarin.Forms TabBar 半透明
- c# - 是否可以在 C# 测试框架中将我的自动 fac 依赖项注入到我的测试中?
- azure-blob-storage - 放弃对 Azure Blob 存储的分段上传
- c++ - 处理应用程序文件生成
- snowflake-cloud-data-platform - 在 Snowflake 中执行异步查询时,结果集的 TTL 是多少?
- android - Android有IDFV吗?
- javascript - 显示来自 html 前代码标记中另一个模板文字中的模板文字的 html
- python - 二进制字符串操作
- django - 在 get_initial 中访问 Django 上下文数据