You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python为现有CSV添加带列头的时间戳列及代码优化咨询

解决CSV导入SQL时的时间戳表头问题与代码优化

一、修复时间戳表头缺失的问题

你当前的代码会给所有行(包括表头行)插入时间戳值,这就导致表头行被改成了时间戳字符串,而不是我们需要的列名(比如timestamp)。解决这个问题很简单,只需要把表头行和数据行分开处理:

  1. 对表头行(rows[0])插入一个明确的列名,比如'timestamp'
  2. 对后续的数据行插入当前的时间戳值

修改后这部分的代码如下:

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")

优化点说明:

  1. 避免修改原CSV文件:直接在读取数据时动态添加时间戳,不需要写入文件,减少了两次IO操作(从「读→写→读」简化为「一次读」)
  2. 内存优化:不再把整个文件加载到内存,而是逐行处理,适合处理大体积的CSV文件
  3. 批量插入提升效率:使用executemany批量提交数据,减少和数据库的交互次数,大幅提升插入速度(尤其是数据量较大时)
  4. 表头处理更简洁:在getColumns函数中直接给原表头添加时间戳列名,不用单独处理文件写入

这样修改后,代码更高效,也避免了误修改原CSV文件的风险,同时完美解决了时间戳表头缺失的问题。

内容的提问来源于stack exchange,提问作者BabaZuri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:48:10