Python处理CSV和Excel需选对工具:CSV用csv模块更轻量,注意编码和分隔符;Excel分析用pandas,读样式/合并单元格用openpyxl;读写时注意索引、编码、空值、千分位等细节。

用 Python 处理 CSV 和 Excel 文件,核心在于选对工具、搞清格式差异、避免常见坑。pandas 是主力,但 openpyxl 和 csv 模块在特定场景下更轻量、更可控。
CSV 批量读取:用 csv 模块更稳,尤其处理大文件或特殊编码
当文件不含公式、不需样式、行数超 10 万,csv 模块比 pandas.read_csv 更省内存、更快启动。关键注意编码(如 GBK 中文 Windows 默认)和分隔符(逗号、制表符、分号都可能)。
- 统一用 with open(..., encoding='utf-8-sig') 开头,自动跳过 BOM;中文 Windows 文件常用 encoding='gbk'
- 用 csv.reader 逐行读,或 csv.DictReader 按列名映射,避免手动切分字符串出错
- 批量读多个 CSV?用 pathlib.Path('data/').glob('*.csv') 获取路径列表,循环处理,比 os.listdir 更简洁安全
Excel 批量读取:pandas 适合分析,openpyxl 适合读样式或单元格值
pandas.read_excel() 默认调用 openpyxl(.xlsx)或 xlrd(旧版 .xls),但 xlrd 从 2.0 版起已不支持 .xlsx。现在统一推荐 openpyxl 引擎,尤其要读合并单元格、批注或指定 sheet 时。
- 读多个 Excel:用 pd.concat([pd.read_excel(f, engine='openpyxl') for f in files], ignore_index=True) 合并成一张表
- 若某列是日期却读成字符串,加参数 parse_dates=['date_col'];数值带千分位(如 "1,234"),先用 thousands=','
- 只读某个 sheet 的某块区域?openpyxl 可直接定位:ws['A1:C10'] 返回单元格对象,再取 .value
批量写入 CSV:用 pandas.to_csv 最省心,但注意 index 和 encoding
to_csv 默认保存索引列,导出后多一列“Unnamed: 0”?加 index=False。Windows 打开乱码?不是 UTF-8 就是编码没声明——用 encoding='utf-8-sig'(加 BOM)或 encoding='gbk'。
立即学习“Python免费学习笔记(深入)”;
- 写入前检查缺失值:pandas 默认把 NaN 写成 nan 字符串,想留空用 na_rep=''
- 字段含逗号、换行符?quoting=csv.QUOTE_ALL 强制加双引号,防止 CSV 结构错乱
- 追加写入(不覆盖)?用 mode='a' + header=False(第二次起不写列名)
批量写入 Excel:openpyxl 支持追加、样式、多 sheet,pandas.to_excel 适合单表快写
pandas.to_excel 简单表一键落地;但要往已有 Excel 追加 sheet、写入特定位置、加粗标题、设置列宽?必须切到 openpyxl。
- 追加 sheet:用 openpyxl.load_workbook('out.xlsx') 打开,wb.create_sheet('new_data'),再循环写入
- 写入整张 DataFrame:用 openpyxl.utils.dataframe.dataframe_to_rows(df, index=False, header=True) 转为行数据,再逐行赋值给 ws.append()
- 设置列宽:循环 for col in ['A', 'B', 'C']: ws.column_dimensions[col].width = 15
不复杂但容易忽略:CSV 和 Excel 的默认行为不同,比如空值表示、日期识别、数字格式。动手前先用 head 或 Excel 打开看一眼原始结构,比硬写十行代码更省时间。










