如何通过Python自动化借助Excel/Numbers修复解析失败的CSV文件?
用Python自动化Numbers/Excel导入导出修复CSV
当然可以!这种CSV解析的坑我也踩过——Numbers/Excel的CSV处理引擎确实比Pandas默认的更宽容,能搞定那些引号和逗号嵌套混乱的“脏”CSV。下面给你几种靠谱的自动化方案,按需选择:
方案1:用AppleScript控制Numbers(Mac专属)
Numbers是苹果生态的软件,用AppleScript配合Python调用是最直接的方式。
步骤:
- 先写一个AppleScript脚本(保存为
fix_csv.scpt):
on run {input_file, output_file} tell application "Numbers" -- 打开目标CSV,Numbers会自动处理解析问题 set doc to open input_file -- 另存为标准CSV,覆盖已有文件 save doc as CSV to output_file with overwrite -- 关闭原文件,不保存修改(避免污染原文件) close doc saving no end tell end run
- 用Python调用这个脚本:
import subprocess def fix_csv_with_numbers(input_path, output_path): try: subprocess.run( ["osascript", "fix_csv.scpt", input_path, output_path], check=True, capture_output=True ) print(f"CSV修复完成,已保存到 {output_path}") except subprocess.CalledProcessError as e: print(f"处理失败:{e.stderr.decode('utf-8')}") # 使用示例 fix_csv_with_numbers("你的损坏文件.csv", "修复后的文件.csv")
这个方案完全模拟你手动操作Numbers的流程,兼容性拉满。
方案2:用Excel的COM接口(跨Windows/Mac)
如果你用的是Excel(不管Windows还是Mac),可以通过COM接口自动化操作:
Windows版本(用pywin32):
首先安装依赖:pip install pywin32
import win32com.client as win32 def fix_csv_with_excel(input_path, output_path): excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 后台运行,不弹出窗口 try: # 打开CSV,Excel会自动处理解析逻辑 workbook = excel.Workbooks.Open(input_path) # 6是CSV格式的文件编号,确保保存为标准CSV workbook.SaveAs(output_path, FileFormat=6) workbook.Close(SaveChanges=False) print(f"CSV修复完成,已保存到 {output_path}") except Exception as e: print(f"处理失败:{str(e)}") finally: excel.Quit() # 使用示例 fix_csv_with_excel("你的损坏文件.csv", "修复后的文件.csv")
Mac版本的Excel:
同样可以用AppleScript,把方案1里的application "Numbers"改成application "Microsoft Excel"即可,脚本逻辑基本一致。
备选方案:直接调整Pandas参数(不用依赖办公软件)
如果不想装Numbers/Excel,也可以试试调优Pandas的read_csv参数,说不定能直接解析:
import pandas as pd try: df = pd.read_csv( "你的损坏文件.csv", engine="python", # 用Python引擎替代默认的C引擎,支持更多参数 quotechar='"', doublequote=False, # 关闭双引号转义,适合不规范的嵌套 escapechar='\\', # 指定转义字符 skip_blank_lines=True ) df.to_csv("修复后的文件.csv", index=False, quoting=1) # 1表示QUOTE_MINIMAL,生成标准CSV print("Pandas直接解析成功!") except Exception as e: print(f"Pandas解析失败,建议用Numbers/Excel方案:{str(e)}")
这个方案适合简单的嵌套问题,如果还是不行,再用前面的办公软件自动化方案就稳了。
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

