Python为现有CSV添加带列头的时间戳列及代码优化咨询
解决CSV导入SQL时的时间戳表头问题与代码优化
一、修复时间戳表头缺失的问题
你当前的代码会给所有行(包括表头行)插入时间戳值,这就导致表头行被改成了时间戳字符串,而不是我们需要的列名(比如timestamp)。解决这个问题很简单,只需要把表头行和数据行分开处理:
- 对表头行(
rows[0])插入一个明确的列名,比如'timestamp' - 对后续的数据行插入当前的时间戳值
修改后这部分的代码如下:
rows = [] with open(csvPath, 'r', newline='') as csvFile: readCSV = csv.reader(csvFile, delimiter=',') for row in readCSV: rows.append(row) # 单独处理表头和数据行 with open(csvPath, 'w', newline='')as writeFile: file_write = csv.writer(writeFile) # 给表头插入时间戳列名 header = rows[0] header.insert(0, 'timestamp') file_write.writerow(header) # 给数据行插入时间戳 for val in rows[1:]: timestamp = datetime.now() val.insert(0, timestamp) file_write.writerow(val)
这样处理后,CSV的表头就会多一个timestamp列,和SQL表中的对应列匹配,导入时就不会因为列不对应或者重复数据的问题报错了。
二、优化updateTable函数的低效问题
你的当前实现有两个明显的低效点:
- 把整个CSV文件读入内存(
rows列表),如果是大文件会占用大量内存 - 先修改原CSV文件,再重新读取一次,做了两次不必要的文件IO操作
其实我们完全可以不用修改原CSV文件,直接在读取数据的过程中添加时间戳,然后直接导入数据库,这样既节省内存,又减少了文件操作的开销。优化后的完整代码如下:
import csv from datetime import datetime # 假设con和cursor已经提前初始化好数据库连接 def getColumns(readCSV): # 获取原表头并添加时间戳列名,同时去除空格 original_columns = next(readCSV) original_columns.insert(0, 'timestamp') return [col.replace(' ', '') for col in original_columns] def insertData(tableName, columns, readCSV): print("Inserting Data") query = 'INSERT INTO {}({}) VALUES ({})'.format( tableName, ','.join(columns), ','.join('?' * len(columns)) ) # 批量提交提升效率,适合大量数据场景 batch_size = 1000 batch = [] for data in readCSV: # 给每行数据动态插入当前时间戳 data.insert(0, datetime.now()) batch.append(data) if len(batch) >= batch_size: cursor.executemany(query, batch) con.commit() batch = [] # 提交剩余的少量数据 if batch: cursor.executemany(query, batch) con.commit() def updateTable(csvPath, tableName): print("Updating table...") print("Reading file contents and uploading into db table...") with open(csvPath, 'r', newline='') as csvFile: readCSV = csv.reader(csvFile, delimiter=',') columns = getColumns(readCSV) insertData(tableName, columns, readCSV) print("Upload complete")
优化点说明:
- 避免修改原CSV文件:直接在读取数据时动态添加时间戳,不需要写入文件,减少了两次IO操作(从「读→写→读」简化为「一次读」)
- 内存优化:不再把整个文件加载到内存,而是逐行处理,适合处理大体积的CSV文件
- 批量插入提升效率:使用
executemany批量提交数据,减少和数据库的交互次数,大幅提升插入速度(尤其是数据量较大时) - 表头处理更简洁:在
getColumns函数中直接给原表头添加时间戳列名,不用单独处理文件写入
这样修改后,代码更高效,也避免了误修改原CSV文件的风险,同时完美解决了时间戳表头缺失的问题。
内容的提问来源于stack exchange,提问作者BabaZuri
相关产品推荐
相关产品推荐

