将CSV指定列科学计数法转为普通数字并导出新CSV(大文件)
问题
现有一份系统导出的3列CSV文件,第一列以科学计数法显示数字。需仅将该列转换为普通数字后导出至新CSV文件,因文件含数千行,无法使用Excel处理。曾尝试float、round相关方法,但未找到适配大文件的方案。
示例输入输出
输入(file1.csv)
ID, Phone, Email 1.23E+15, 123-456-7890, johnsmith@test.com
输出(file2.csv)
ID, Phone, Email 1234680000000000, 123-456-7890, johnsmith@test.com
尝试的错误代码
import pandas import numpy as np pandas.read_csv('file1.csv', dtype=np.float64) df = df.apply(pd.to_numeric, errors='coerce') df.round(0) df.to_csv(float_format='file2.csv')
错误原因分析
- 第一行
pandas.read_csv未赋值给df,导致后续代码中df未定义 df.apply(pd.to_numeric)属于冗余操作,无需全表转换数值类型df.round(0)未重新赋值,Pandas方法默认返回新对象,不会修改原DataFramedf.to_csv参数错误:float_format是指定浮点数格式的参数,文件名应作为第一个位置参数传入
解决方案
方法1:Pandas 常规处理(适合多数大文件场景)
修正代码逻辑,精准处理目标列,避免不必要的类型转换:
import pandas as pd # 读取CSV,指定各列类型,防止Phone等列被误转 df = pd.read_csv('file1.csv', dtype={'ID': float, 'Phone': str, 'Email': str}) # 将ID列转为整数,消除科学计数法 df['ID'] = df['ID'].astype(int) # 导出CSV,不写入索引列 df.to_csv('file2.csv', index=False)
如果文件过大,可采用分块读取减少内存占用:
import pandas as pd chunk_size = 1000 # 每次处理1000行 with pd.read_csv('file1.csv', chunksize=chunk_size, dtype={'ID': float, 'Phone': str, 'Email': str}) as reader: for idx, chunk in enumerate(reader): chunk['ID'] = chunk['ID'].astype(int) # 第一块写入表头,后续块追加内容 chunk.to_csv('file2.csv', index=False, mode='w' if idx == 0 else 'a', header=idx == 0)
方法2:CSV模块逐行处理(极致内存友好,超大型文件首选)
用Python内置csv模块逐行读写,无需加载全表到内存:
import csv with open('file1.csv', 'r', newline='') as infile, open('file2.csv', 'w', newline='') as outfile: reader = csv.DictReader(infile) writer = csv.DictWriter(outfile, fieldnames=reader.fieldnames) writer.writeheader() for row in reader: # 科学计数法字符串转整数后转回字符串,确保输出为普通数字格式 row['ID'] = str(int(float(row['ID']))) writer.writerow(row)
内容的提问来源于stack exchange,提问作者Jeff Irwin
相关产品推荐
相关产品推荐

