Pyarrow read_csv 如何处理不同的文件编码?
How does Pyarrow read_csv handle different file encodings?
我有一个 .dat 文件,我一直在使用 pd.read_csv
读取它,并且总是需要使用 encoding="latin"
才能正确读取/没有错误。当我使用 pyarrow.csv.read_csv
时,我没有看到 select 文件编码的参数,但它仍然可以正常工作(这太棒了!但我不明白为什么/如果它只自动处理某些编码)。我使用的唯一参数是设置 delimiter="|"
(使用 ParseOptions)和 auto_dict_encode=True
使用(ConvertOptions)。
pyarrow 如何处理不同的编码类型?
pyarrow
目前没有处理不同编码的功能,并且假定 string/text 数据为 UTF8。
但它没有引发错误的原因是 pyarrow 会将任何非 UTF8 字符串读取为 "binary" 类型列,而不是 "string" 类型。
一个小例子:
# 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 ù
现在可以使用 pyarrow.read_csv 指定编码。
根据 pyarrow docs for read_csv:
The encoding can be changed using the ReadOptions class.
下面是一个最小的例子:
from pyarrow import csv
options = csv.ReadOptions(encoding='latin1')
table = csv.read_csv('path/to/file', options)
据我所知,该功能是在 this PR 中添加的,因此它应该从 pyarrow 1.0 开始工作。
我有一个 .dat 文件,我一直在使用 pd.read_csv
读取它,并且总是需要使用 encoding="latin"
才能正确读取/没有错误。当我使用 pyarrow.csv.read_csv
时,我没有看到 select 文件编码的参数,但它仍然可以正常工作(这太棒了!但我不明白为什么/如果它只自动处理某些编码)。我使用的唯一参数是设置 delimiter="|"
(使用 ParseOptions)和 auto_dict_encode=True
使用(ConvertOptions)。
pyarrow 如何处理不同的编码类型?
pyarrow
目前没有处理不同编码的功能,并且假定 string/text 数据为 UTF8。
但它没有引发错误的原因是 pyarrow 会将任何非 UTF8 字符串读取为 "binary" 类型列,而不是 "string" 类型。
一个小例子:
# 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 ù
现在可以使用 pyarrow.read_csv 指定编码。 根据 pyarrow docs for read_csv:
The encoding can be changed using the ReadOptions class.
下面是一个最小的例子:
from pyarrow import csv
options = csv.ReadOptions(encoding='latin1')
table = csv.read_csv('path/to/file', options)
据我所知,该功能是在 this PR 中添加的,因此它应该从 pyarrow 1.0 开始工作。