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加空格分隔的问题在于:
ANAGRAFICA列本身包含空格(姓名的名和姓),导致read_csv会把姓名拆成多列,直接打乱了列的对应关系;- 这种报表没有固定的分隔符,有的列之间是1个空格,有的是多个,完全不适合用分隔符解析。
而固定列宽的思路,是根据每个字段在文本中的固定位置来分割,完美避开了空格作为内容的问题。
内容的提问来源于stack exchange,提问作者LoganDTR
相关产品推荐
相关产品推荐

