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

Python读取TXT报表表格的导入问题求解

解决TXT报表导入Python的列错位与分隔问题

你遇到的这种带空格姓名的报表,根本不能用空格作为分隔符来解析——这也是read_csv搞砸的核心原因。这种报表本质是固定列宽格式,不是分隔符分隔的,所以得换思路来处理。咱们一步步来:

第一步:清理原始文本里的无效内容

你的原始文本里有大量Ò字符和空行,这些会干扰解析,先把它们清掉:

# 读取原始文件(用latin-1编码兼容特殊字符)
with open('test.txt', 'r', encoding='latin-1') as f:
    lines = f.readlines()

# 清理每行的Ò、空行,同时去掉首尾空格
cleaned_lines = []
for line in lines:
    processed_line = line.replace('Ò', '').strip()
    if processed_line:  # 跳过空行
        cleaned_lines.append(processed_line)

# 保存清理后的文件
with open('cleaned_test.txt', 'w', encoding='utf-8') as f:
    f.write('\n'.join(cleaned_lines))

清理后的内容会变成这样:

NDG ANAGRAFICA RAPPORTO S.CONTABILE FIDO BASE STR. FIDO PROP. F./SC. INIZ. GG.  STATUS POSIZIONE
335647423 ERNESTORI MATTIO 03/045/23467890* 5,67 0,00 0,00 13,20 1/73 02/03/21 3  +RIENTRO SCAD/SCO
567890432 PIAL MASSIMILI 23/345/12345678* 131,42- 0,00 0,00 124,34 1/34 06/03/21 1

第二步:用固定列宽格式读取数据

Pandas专门提供了read_fwf()来处理固定列宽的报表。我们需要先确定每一列的起始和结束位置(数字符位置就行),然后指定colspecs参数:

import pandas as pd

# 定义列名(根据你的报表字段调整)
column_names = [
    'NDG', 'ANAGRAFICA', 'RAPPORTO_S_CONTABILE',
    'FIDO_BASE', 'STR_FIDO', 'PROP', 'F_SC',
    'INIZ', 'GG', 'CODE', 'STATUS_POSIZIONE'
]

# 定义每一列的字符位置范围(根据清理后的文本数出来的)
column_specs = [
    (0, 9),    # NDG
    (9, 25),   # ANAGRAFICA(包含姓名空格)
    (25, 41),  # RAPPORTO S.CONTABILE
    (41, 47),  # FIDO BASE
    (47, 53),  # STR. FIDO
    (53, 59),  # PROP.
    (59, 65),  # F./SC.
    (65, 70),  # INIZ.
    (70, 79),  # GG.
    (79, 82),  # 中间的数字代码
    (82, None) # STATUS POSIZIONE(剩下的所有内容)
]

# 读取清理后的文件,跳过原始表头(因为我们自己指定了列名)
df = pd.read_fwf(
    'cleaned_test.txt',
    colspecs=column_specs,
    names=column_names,
    skiprows=[0]  # 跳过第一行原始表头
)

print(df)

运行后你会发现,姓名列ANAGRAFICA和状态列STATUS_POSIZIONE都能正确识别了,不会再错位。

第三步:处理数值格式(可选但必要)

报表里的数值用逗号做小数点,还有像131,42-这种反向负号,得转换成标准数值格式:

# 处理反向负号和逗号小数点
def clean_numeric(value):
    value_str = str(value).strip()
    if value_str.endswith('-'):
        return -float(value_str[:-1].replace(',', '.'))
    return float(value_str.replace(',', '.'))

# 对所有数值列应用清理函数
numeric_columns = ['FIDO_BASE', 'STR_FIDO', 'PROP', 'F_SC']
df[numeric_columns] = df[numeric_columns].applymap(clean_numeric)

print(df)

为什么之前的方法不行?

你用read_csv加空格分隔的问题在于:

  1. ANAGRAFICA列本身包含空格(姓名的名和姓),导致read_csv会把姓名拆成多列,直接打乱了列的对应关系;
  2. 这种报表没有固定的分隔符,有的列之间是1个空格,有的是多个,完全不适合用分隔符解析。

而固定列宽的思路,是根据每个字段在文本中的固定位置来分割,完美避开了空格作为内容的问题。

内容的提问来源于stack exchange,提问作者LoganDTR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 20:48:12