如何在数据中使用 pandas read_fwf 和日文字符

问题描述 投票:0回答:1

我正在尝试从包含日本城市名称的文本文件中读取数据。每行包含 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,
)

生成的数据框如下:

resulting dataframe

我本以为编码会让 pandas 知道如何处理事情。 有没有针对这个问题的本地 pandas 解决方案?

我已经阅读了整个 read_fwfread_csvIO 工具 文档,并广泛搜索了 SO 问题 herehereherehereherehere但什么也没想到。

我想避免构建自己的解析器,尽管可以通过字节读取和切片来实现。

python pandas text-parsing cjk fixed-width
1个回答
0
投票

您传递的是 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
© www.soinside.com 2019 - 2024. All rights reserved.