DataFrame转固定宽度文件出错,求问题排查方法
问题描述
我在读取固定宽度文本文件并加载到DataFrame,之后调整列顺序生成固定宽度格式文件时出现问题,请求排查错误原因。
代码示例
# 从目标目录读取文件 for file in fileNames: if file.is_file(): print(file.name) # 读取固定宽度文件 transfile = pd.read_fwf(file , skiprows=1, skipfooter=1, header=None, converters={0:str, 1:str}, keep_default_na=False, widths=[ 12,#ID 索引1 12,#SURNAME 索引2 7,#FIRSTNAME 索引3 1,#MIDDLEINITIAL 索引4 1,#GENDER 索引5 8,#BIRTHDATE 索引6 1,#占位符 索引7.... # 创建DataFrame对象 df = pd.DataFrame(columns=[ 'recordType', 'ID','SURNAME','FIRSTNAME'... # 按列填充至固定宽度 df['DI']=tc61[0] df['SURNAME']=tc61[1] df['FIRSTNAME']=tc61[2] df['MIDDLEINITIAL']=tc61[3] df['GENDER']=tc61[4] df['ID']=df['ID'].str.ljust(12," ").replace(np.nan, ' ') df['SURNAME']=df['SURNAME'].str.ljust(12," ").replace(np.nan, ' ') df['FIRSTNAME']=df['FIRSTNAME'].str.ljust(7," ").replace(np.nan, ' ') df['MIDDLEINITIAL']=df['MIDDLEINITIAL'].str.ljust(1," ").replace(np.nan, ' ') # 合并所有列 fixedWidthFile = order[order.columns[0:]].apply(lambda x:''.join(x.dropna().astype(str)),axis=1) # 写入文本文件 file = open("file.txt", "w+") content = str(fixedWidthFile) file.write(content) file.close() file = open("file.txt", "r") content = file.read() print("\nfile.txt内容:\n", content) file.close()
错误排查点
- 未定义变量引用:代码中使用了
tc61和order两个未定义的变量,推测tc61应为读取后的transfile,order应为创建的目标DataFramedf,变量名不匹配会直接抛出NameError。 - 列名不匹配:创建DataFrame时定义了列
recordType,但填充数据时用了df['DI'],列名不一致会导致目标列缺失数据,且产生多余无意义的列DI。 - 文件读取循环逻辑缺失:遍历文件列表时仅打印文件名,未将每个文件的内容读取并处理,最终只会处理循环最后一个
file对象,若要批量处理需在循环内完成读取、转换、写入的完整流程。 - 字符串处理逻辑错误:调用
str.ljust前未处理NaN值,若列存在NaN会抛出AttributeError,正确做法应先填充NaN为空字符串再调用字符串方法,例如df['ID'] = df['ID'].fillna('').str.ljust(12, ' ')。 - 文件写入格式错误:直接将Series转为字符串写入文件,会包含索引和Series的格式标记(如
0 xxxxx\n1 yyyyy),而非纯固定宽度文本行。应使用fixedWidthFile.to_csv('file.txt', index=False, header=False)或循环写入每行内容。 - read_fwf参数问题:
skipfooter参数仅在engine='python'时生效,默认engine为c不支持该参数,会导致无法跳过末尾行;另外widths列表未完整定义,末尾的....会导致宽度数量与实际列数不匹配,引发读取错误。
内容的提问来源于stack exchange,提问作者user3698018
相关产品推荐
相关产品推荐

