为何列表中的字符串元素存入CSV文件后会被转换为整数?
为什么CSV里的前导0会丢失?
这个问题我之前踩过坑!其实不是你的Python代码把'0132176084'转成整数了——你用记事本打开生成的numberofbugs.csv文件看看,前导0肯定还好好的在里面。真正的问题出在你用来查看CSV的工具(比如Excel、WPS表格这类电子软件):它们在读取CSV时会自动做类型识别,把看起来像数字的字符串默认解析成整数格式,而整数是不需要前导0的,所以就被自动去掉了。
解决办法
针对这个问题,有两种简单的处理方式,能让阅读器把这类带前导0的字段识别为文本:
1. 给字段添加单引号前缀
在写入CSV时,给需要保留前导0的字符串前面加一个英文单引号,电子表格工具看到这个前缀就会把单元格当作文本处理,而且会自动隐藏单引号,只显示带前导0的内容。修改你的循环代码即可:
import csv mylist = [['HBASE-5727', 2, '66772ce043', '1044d5e353'], ['HBASE-5286', 2, '180b41f518', '0132176084'], ['HBASE-532', 3, 'ef5bb6f316', 'fb2db8cdaa'] ] with open("numberofbugs.csv",'w') as csvfile: header = ['bug_id', 'number_of_bugs', 'first_commitID', 'last_commitID'] writers = csv.writer(csvfile) writers.writerow(header) for item in mylist: # 给第四个字段(last_commitID)添加单引号前缀 item[3] = f"'{item[3]}" writers.writerow(item)
2. 用csv模块的quoting参数强制包裹字段
通过设置quoting=csv.QUOTE_ALL,让每个字段都被双引号包裹,电子表格工具会把带双引号的全数字字符串识别为文本,保留前导0。这种方法不需要修改字段内容,只需要调整writer的初始化:
import csv mylist = [['HBASE-5727', 2, '66772ce043', '1044d5e353'], ['HBASE-5286', 2, '180b41f518', '0132176084'], ['HBASE-532', 3, 'ef5bb6f316', 'fb2db8cdaa'] ] with open("numberofbugs.csv",'w') as csvfile: header = ['bug_id', 'number_of_bugs', 'first_commitID', 'last_commitID'] # 启用全字段引号包裹 writers = csv.writer(csvfile, quoting=csv.QUOTE_ALL) writers.writerow(header) for item in mylist: writers.writerow(item)
两种方法都能解决问题,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者YusufUMS
相关产品推荐
相关产品推荐

