Python写入CSV文件教程:csv模块与pandas两种写法
用Python把数据写入CSV文件,分别给出标准库csv和pandas to_csv两种写法,支持中文表头、追加模式、自定义分隔符,附完整代码。
场景痛点
处理完数据要导出给同事、传给系统、做报表,结果手动复制粘贴到Excel里,格式容易串、换行错位、中文乱码。用Python直接写CSV,一次成型,格式稳定,下次改个路径就能复用。
用到的库
pip install pandas
完整代码
# 用Python写入CSV文件
import csv
import pandas as pd
def write_with_csv_module(file_path):
"""用标准库csv.writer写入,适合一行一行追加、数据量不大的场景。"""
headers = ["姓名", "年龄", "城市", "月薪"]
data = [
["张三", 28, "北京", 18000],
["李四", 32, "上海", 22000],
["王五", 26, "深圳", 15000],
["赵六", 35, "杭州", 25000],
]
# newline="" 防止Windows写出空行
# encoding="utf-8-sig" 让Excel双击打开不乱码
with open(file_path, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(headers) # 写表头
writer.writerows(data) # 批量写多行
print(f"csv模块写入完成:{file_path}")
def append_row(file_path, new_row):
"""追加一行到已有CSV末尾。"""
with open(file_path, "a", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(new_row)
print(f"已追加一行:{new_row}")
def write_with_pandas(file_path):
"""用pandas写入,适合已经是DataFrame的数据。"""
df = pd.DataFrame({
"姓名": ["孙七", "周八"],
"年龄": [29, 41],
"城市": ["广州", "成都"],
"月薪": [19000, 21000],
})
# index=False 不写pandas自带的行号列
df.to_csv(file_path, index=False, encoding="utf-8-sig")
print(f"pandas写入完成:{file_path}")
def main():
out1 = "output_csv_module.csv"
out2 = "output_pandas.csv"
write_with_csv_module(out1)
append_row(out1, ["吴九", 30, "南京", 17000])
write_with_pandas(out2)
if __name__ == "__main__":
main()
代码讲解
csv.writer(f)返回写入器,writerow写一行,writerows批量写列表的列表。- 打开模式
"w"是覆盖写,"a"是追加写,追加时不要重复写表头。 encoding="utf-8-sig"带BOM,Excel双击打开中文不会乱码;如果是给Linux程序读,用"utf-8"即可。newline=""必须加,否则Windows下每行之间多一个空行。- pandas的
df.to_csv()一行导出,index=False去掉左侧那列行号。
运行结果
当前目录生成两个CSV文件:output_csv_module.csv 有5行数据(含追加的吴九),output_pandas.csv 有2行数据。用Excel或记事本打开都能看到中文正常显示。
注意事项
- 字段里本身带逗号、换行、引号时,csv模块会自动加引号转义,不用手动处理。
- 追加写文件时如果原文件不存在,第一次会自动创建,但表头要自己判断是否需要写。
- pandas导出超大DataFrame时可以加
chunksize=100000分块写,避免内存峰值。 - 想写成分号分隔或制表符,加
delimiter=";"或delimiter="\t"。

更新时间:2026-09-14 20:54:07
上一篇:Python写入JSON文件教程:json.dump中文不转义