Pandas导出CSV时如何保留数值型字符串的格式?
解决Pandas导出CSV时保留数值型字符串前导零的问题
这个问题我碰到过好多次了——本质上是因为CSV是无类型的纯文本格式,再加上Pandas导出时的默认逻辑,或者后续打开工具(比如Excel)的自动解析,会把看起来像数值的字符串(比如"0000")转成整数(0),导致前导零丢失。下面几个方法亲测有效:
1. 先确保DataFrame里的列确实是字符串类型
很多时候问题出在第一步:你以为已经把列设为字符串了,但实际上可能没生效。比如如果数据源是数值类型,直接转字符串才保险:
import pandas as pd # 假设你的目标列是'code' df['code'] = df['code'].astype(str) # 如果需要固定长度(比如4位),用zfill自动补前导零 df['code'] = df['code'].str.zfill(4)
这一步一定要做,否则后面的导出操作都是白搭。
2. 导出时给字符串列加保护标记
方法A:用quoting参数强制加引号
Pandas的to_csv可以通过csv模块的参数,给非数值列加上双引号。这样CSV文件里的字符串会被引号包裹,不管是Excel还是其他工具打开,都会识别为文本:
import csv # QUOTE_NONNUMERIC会给所有非数值类型的列加双引号 df.to_csv('output.csv', quoting=csv.QUOTE_NONNUMERIC, index=False)
导出后打开CSV文件,你会看到"0000"这样的内容,Excel打开时就不会转成数字了。
方法B:给字符串加前导单引号
如果主要是用Excel打开,给字符串前加一个单引号是个更“隐形”的办法——Excel会把单引号当成文本标记,不显示它,但会保留整个字符串的格式:
df['code'] = "'" + df['code'] df.to_csv('output.csv', index=False)
导出后Excel里显示的是0000,但CSV文件里实际存的是'0000,完美解决问题。
3. 给特定列指定导出格式
如果你的列是固定长度的字符串,还可以用formatters参数给列定制导出格式,确保输出符合要求:
# 给'code'列指定格式:如果是整数就转成4位带前导零的字符串,否则保持原样 formatters = {'code': lambda x: f'{x:04d}' if isinstance(x, int) else x} df.to_csv('output.csv', formatters=formatters, index=False)
这个方法适合列里混合了整数和字符串的场景。
小提醒:有时候你以为导出后丢失了前导零,其实CSV文件里是存在的——只是Excel默认把它解析成了数字。可以用记事本打开CSV文件确认,如果里面是
"0000"或者'0000,那就是打开工具的问题,不是导出的问题。
内容的提问来源于stack exchange,提问作者Aklys
相关产品推荐
相关产品推荐

