csv - Pyarrow read_csv 如何处理不同的文件编码?
问题描述
我有一个 .dat 文件,我一直在阅读它,pd.read_csv
并且总是需要使用encoding="latin"
它才能正确读取/没有错误。当我使用时,pyarrow.csv.read_csv
我没有看到用于选择文件编码的参数,但它仍然可以正常工作(这很棒!但我不明白为什么/如果它只自动处理某些编码)。我使用的唯一参数是设置delimiter="|"
(使用 ParseOptions)和auto_dict_encode=True
使用(ConvertOptions)。
pyarrow 如何处理不同的编码类型?
解决方案
pyarrow
目前没有处理不同编码的功能,并且假定 UTF8 用于字符串/文本数据。
但它不会引发错误的原因是 pyarrow 会将任何非 UTF8 字符串读取为“二进制”类型列,而不是“字符串”类型。
一个小例子:
# writing a small file with latin encoding
with open("test.csv", "w", encoding="latin") as f:
f.writelines(["col1,col2\n", "u,ù"])
使用 pyarrow 读取为第一列提供字符串(仅包含 ASCII 字符,因此也是有效的 UTF8),但将第二列读取为二进制:
>>> from pyarrow import csv
>>> csv.read_csv("test.csv")
pyarrow.Table
col1: string
col2: binary
使用 pandas,默认情况下确实会出现错误(因为 pandas 没有二进制数据类型,并且会尝试将所有文本列读取为 python 字符串,因此是 UTF8):
>>> pd.read_csv("test.csv")
...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf9 in position 0: invalid start byte
>>> pd.read_csv("test.csv", encoding="latin")
col1 col2
0 u ù
推荐阅读
- nginx - NGINX:从位置阻止,如果捕获参数为空
- c# - 如何将 MS Graph 消息保存为 .eml 文件
- laravel - 在 OAuth 2 和会话身份验证之间共享登录
- elasticsearch - Elasticsearch 6.2.4:如何按 _score 对聚合结果进行排序?
- php - 联系表 - 提交后如何不重定向到另一个页面
- javascript - javascript:在没有库的情况下保存字符/数字
- c - 如何修改指向void函数内部结构的指针
- ruby-on-rails - Rails 从哪里获取他们的 DateTime.now?
- node.js - PORT 环境变量更改了 Google App Engine
- pattern-matching - 通过 ocaml 中的参数名称和模式匹配进行绑定