You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Pandas read_fwf()读取含换行的固定宽度文件时拆分行的问题?

如何解决Pandas read_fwf()读取含换行的固定宽度文件时拆分行的问题?

这种固定宽度文件里的行换行问题确实挺头疼的,我之前处理类似的统计数据时也碰到过,给你两种靠谱的解决思路:

方案一:读取前预处理文本,合并断行

这个方法是从根源上解决问题——先把文件里的断行合并好,再交给 Pandas 读取。思路很简单:那些断行的行开头都是空格(比如你例子里的 GA),我们只要把这些行拼接到上一行就行。

代码示例:

import pandas as pd
import requests
from io import StringIO

url = "你的目标固定宽度文件URL"
# 先获取文件文本内容
response = requests.get(url)
lines = response.text.splitlines()

# 预处理合并断行
processed_lines = []
for line in lines:
    # 判断当前行是否是上一行的延续(开头为空格)
    if line.startswith(' '):
        # 去掉上一行末尾的冗余字符和当前行开头的空格,然后拼接
        processed_lines[-1] = processed_lines[-1].rstrip() + line.lstrip()
    else:
        processed_lines.append(line)

# 把处理后的文本转换成可读取的对象,再用read_fwf读取
df = pd.read_fwf(StringIO('\n'.join(processed_lines)), skiprows=8, skipfooter=6, header=1)

这样处理后,Atlanta-Sandy Springs-Alpharetta, 和 GA 就会合并成一个完整的城市名,Pandas 就能正确识别每一列了。

方案二:读取后修复错误的DataFrame

如果已经用原来的方式读取了数据,也可以直接在 DataFrame 里修复这些拆分的行。核心思路是找到那些数值列全为 NaN 的行,把下一行的州名和数值合并过来。

代码示例:

import pandas as pd

url = "你的目标固定宽度文件URL"
# 按原方法读取错误的DataFrame
df = pd.read_fwf(url, skiprows=8, skipfooter=6, header=1)
df = df.reset_index(drop=True)  # 重置索引方便遍历

i = 0
while i < len(df) - 1:
    # 判断当前行是否是拆分的第一行(数值列全空,下一行有数值)
    if pd.isna(df.iloc[i, 3]) and not pd.isna(df.iloc[i+1, 3]):
        # 合并城市名和州名
        df.iloc[i, 2] = str(df.iloc[i, 2]).rstrip(',') + str(df.iloc[i+1, 0]).lstrip()
        # 把下一行的数值列移到当前行
        df.iloc[i, 3:] = df.iloc[i+1, 1:]
        # 删除多余的下一行
        df = df.drop(i+1).reset_index(drop=True)
    else:
        i += 1

# 清理可能多余的全NaN列
df = df.dropna(axis=1, how='all')

两种方案对比

  • 预处理方案更稳定,适合所有类似的断行场景,尤其是文件较大时,提前处理能避免后续DataFrame的混乱。
  • 读取后修复的方案更灵活,适合已经读取了数据、不想重新下载的情况,但需要根据你的DataFrame结构调整判断条件(比如列索引、判断NaN的位置)。

备注:内容来源于stack exchange,提问作者user2895444

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 08:43:08