我正在尝试从包含日本城市名称的文本文件中读取数据。每行包含 32 个字节,其中名称列为 22 个字节。
当我尝试使用
pandas.read_fwf()
时,结果是错误的,因为 pandas 以某种方式将相关日语字符计算为 1 个字节而不是 2 个字节。
这是一个工作代码片段:
from io import StringIO
import pandas as pd
data = pd.read_fwf(
StringIO(
"""
7271熊本県天草・芦北地方 2K
2 43青森県三八上北地方 1K
3103新島・神津島近海 42K
2 48岩手県沿岸北部 17K
1 18北海道南西沖 2K
3 87茨城県南部 13K
2 50宮城県沖 6K
7264有明海 3K
7267橘湾 2K
"""
),
encoding="SHIFT-JIS",
widths=[1, 3, 22, 5, 1],
header=None,
)
生成的数据框如下:
我本以为编码会让 pandas 知道如何处理事情。 有没有针对这个问题的本地 pandas 解决方案?
我已经阅读了整个 read_fwf、read_csv 和 IO 工具 文档,并广泛搜索了 SO 问题 here、here、here、here、here 和 here但什么也没想到。
我想避免构建自己的解析器,尽管可以通过字节读取和切片来实现。
您传递的是 StringIO,而不是 BytesIO,因此字符串包含 Unicode 代码点,而不是字节。不使用编码参数。但即使你使用 BytesIO,编码也会把它变成代码点,你仍然会遇到同样的问题。
我发现,至少对于这个示例数据,推断列的默认设置是有效的,加上一个更好地对齐显示的选项:
import io
import pandas as pd
# Display a dataframe with east asian characters better
pd.options.display.unicode.east_asian_width = True
data = pd.read_fwf(
io.StringIO(
"""
7271熊本県天草・芦北地方 2K
2 43青森県三八上北地方 1K
3103新島・神津島近海 42K
2 48岩手県沿岸北部 17K
1 18北海道南西沖 2K
3 87茨城県南部 13K
2 50宮城県沖 6K
7264有明海 3K
7267橘湾 2K
"""
),
header=None,
)
print(data)
输出(仍然不完美,但比没有东亚选项要好):
0 1
0 7271熊本県天草・芦北地方 2K
1 2 43青森県三八上北地方 1K
2 3103新島・神津島近海 42K
3 2 48岩手県沿岸北部 17K
4 1 18北海道南西沖 2K
5 3 87茨城県南部 13K
6 2 50宮城県沖 6K
7 7264有明海 3K
8 7267橘湾 2K