使用pd.read_fwf读取不定宽空格分隔文件后如何将筛选结果完整写入CSV
核心原因说明
- pandas默认的终端打印机制仅展示DataFrame前后各30行内容,中间行用省略号替代。这是打印端的展示规则,不代表read_fwf没有读取到全量数据,内存中存储的DataFrame是完整的。
- 原写入逻辑存在严重错误。
csv.writer.writerow()要求传入单行的字段值列表,代码中将整个筛选后的DataFrame对象包裹在列表中传入,writer会直接把DataFrame的字符串打印形式(带省略号的截断内容)作为单个字段写入文件,无法实现逐行全量写入。
修正实现方案
- 无需手动调用csv模块写文件,pandas内置的
to_csv()方法可自动完成行列拆分、字段转义,直接实现全量数据写入。 - 读取阶段显式指定列的字符边界,避免因列间距不统一、STN_NAME字段含空格导致的列错位问题。
可直接运行的修正代码
import os import pandas as pd # 根据文件实际字符偏移量定义每列的起止位置,确保STN_NAME列宽度足够容纳带空格的站点名 col_specs = [ (0, 12), # STN CODE列 (13, 21), # LAT列 (22, 30), # LON列 (31, 37), # Un_1列 (38, 67), # STN_NAME列(预留足够宽度适配带空格的名称) (68, 72), # S_YR列 (73, 77), # E_YR列 (78, 83) # Un_2列 ] # 全量读取文件 data = pd.read_fwf( 'radiosonde_stations.csv', colspecs=col_specs, names=['STN_CODE', 'LAT', 'LON', 'Un_1', 'STN_NAME', 'S_YR', 'E_YR', 'Un_2'], infer_nrows=2790 ) # 按经纬度范围筛选符合要求的站点 query = data[ (data['LAT'] >= -18) & (data['LAT'] <= 45) & (data['LON'] >= 48) & (data['LON'] <= 117) ] # 全量写入目标文件 output_path = os.path.join('/home/DATA/RADIOSONDE/', 'southeast_asia_stnlist.csv') # mode='a'为追加模式,首次写入可去掉header=False参数自动生成表头 query.to_csv(output_path, index=False, mode='a', header=False)
关键注意事项
- 可通过
len(query)直接查看筛选后的总行数,验证数据读取的完整性,无需依赖终端打印的截断内容判断数据量。 - 列宽参数
colspecs可根据实际文件的字符偏移量微调,确保不会将STN_NAME的内容切到后续的年份列中。 - 若为首次写入目标文件,删除代码中的
header=False参数,方法会自动将列名作为表头写入,避免后续读取时无列名匹配。
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

