Python读取EBCDIC文件失败,求转CSV/TXT解决方案
解决EBCDIC(.ebc)文件转CSV/TXT问题
问题描述
一直尝试读取.ebc格式文件但未能成功,希望将其保存为.csv或.txt格式(不熟悉该文件格式)。该文件属于地下注入控制数据,有对应的格式说明文档,尝试了多个相关方法均无效:
- 用
codecs解码无任何输出:import codecs with open("uif700a.txt", "rb") as ebcdic: ascii_txt = codecs.decode(ebcdic.read(), "cp500") print(ascii_txt) - 指定
cp500编码读取.ebc文件无输出:with open("uif700.ebc", encoding='cp500') as f: print(f.read()) - 读取ASCII版本文件时触发错误:
data = pd.read_csv('uif700a.txt', on_bad_lines='skip', encoding = "cp037",header=None)EmptyDataError: No columns to parse from file
解决步骤
1. 确认文件实际编码
EBCDIC有多种编码分支(cp037、cp500等),先检测文件真实编码:
import chardet with open("uif700.ebc", "rb") as f: detect_result = chardet.detect(f.read()) print(detect_result)
用输出的encoding值替换后续解码时的编码参数。
2. 按固定宽度格式读取(核心)
这类官方公开数据文件几乎都是固定宽度格式,不是CSV,直接用read_csv会报错。参考格式说明文档的字段长度定义,用pd.read_fwf处理:
import pandas as pd # 替换为文档中实际定义的各字段宽度列表 col_widths = [10, 8, 15, 20] # 用检测到的编码读取文件 df = pd.read_fwf("uif700.ebc", widths=col_widths, encoding="cp037", header=None) # 导出为CSV df.to_csv("uif700_converted.csv", index=False)
3. 手动解码拆分字段
如果read_fwf无效,先完整解码为文本,再按固定宽度拆分:
import codecs import csv # 用正确编码解码文件 with open("uif700.ebc", "rb") as f: raw_content = codecs.decode(f.read(), "cp037") # 按行拆分并提取字段 processed_rows = [] for line in raw_content.splitlines(): if not line.strip(): continue # 替换为实际字段的起始、结束索引 fields = [ line[0:10].strip(), line[10:18].strip(), line[18:33].strip() ] processed_rows.append(fields) # 写入CSV文件 with open("output.csv", "w", newline="", encoding="utf-8") as f: writer = csv.writer(f) writer.writerows(processed_rows)
4. 检查文件完整性
如果解码后无内容,对比本地文件大小与官网标注的大小,确认是否下载完整,重新尝试下载。
内容的提问来源于stack exchange,提问作者Veronica Guzman
相关产品推荐
相关产品推荐

