csv - Pyarrow read_csv 如何处理不同的文件编码?

标签 csv pyarrow apache-arrow

我有一个 .dat 文件,我一直在用 pd.read_csv 读取它,并且总是需要使用 encoding="latin" 才能正确读取/没有错误.当我使用 pyarrow.csv.read_csv 时,我没有看到用于选择文件编码的参数,但它仍然可以正常工作(这太棒了!但我不明白为什么/如果它只自动处理某些编码)。我使用的唯一参数是设置 delimiter="|"(使用 ParseOptions)和使用(ConvertOptions)设置 auto_dict_encode=True

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    ù

关于csv - Pyarrow read_csv 如何处理不同的文件编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62153229/

相关文章:

python - 类型错误 : 'str' does not support the buffer interface, Python 3

python - Azure 数据湖的 Pyarrow 切片下推

python - 如何使用 Arrow 对 CSV 进行分块?

hdfs - 如何使用pyarrow在HDFS上写入

python - 如何用时区解析时间戳?

c++ - pyarrow 表到 PyObject* 通过 pybind11

c# - 如何在 .Net Spark 中的 VectorUdf 中将数组列作为参数传递?

r - 不带逗号跳过行

csv - 将带有坐标的节点从 CSV 导入 Gephi

java - 使用 python 将 CSV 文件转换为 LIBSVM 兼容数据文件