【问题标题】:Read from CSV file and insert into database Python从 CSV 文件读取并插入数据库 Python
【发布时间】:2019-05-17 18:16:06
【问题描述】:

我正在尝试读取 CSV 文件并插入 PostgreSQL 数据库。但我希望第 1 列和第 5 列项目为整数。所以,我将第 1 列和第 5 列转换为整数。但它显示错误

IndexError: 列表索引超出范围>

    with open('parts_time.txt') as csvfile:
        readCSV = csv.reader(csvfile, delimiter=',')
        for row in readCSV:

            date_2 = int(row[0])
            date_4 = int(row[4])

            cursor.execute("INSERT INTO parts_time 
            (time_id,time_day,time_month,time_year,vendor_idk)"\
            "VALUES (%s,%s,%s,%s,%s)",
           [date_2,row[1],row[2],row[3],date_4])

【问题讨论】:

  • 你可能在文件末尾有一个空行
  • csv中的表头是否与表中的表头相同?

标签: python database list csv indexing


【解决方案1】:

只有在里面有东西时才尝试处理该行:

with open('parts_time.txt') as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    for row in readCSV:
        if row:
            date_2 = int(row[0])
            date_4 = int(row[4])

            cursor.execute("INSERT INTO parts_time 
            (time_id,time_day,time_month,time_year,vendor_idk)"\
            "VALUES (%s,%s,%s,%s,%s)",
            [date_2,row[1],row[2],row[3],date_4])

【讨论】:

    【解决方案2】:

    由于您获得 IndexError,您的文件似乎包含空行 试试这个。

    with open('t.txt') as csvfile:
        readCSV = csv.reader(csvfile, delimiter=',')
        for row in readCSV:
            if len(row) != 5:
                continue
            date_2 = int(row[0])
            date_4 = int(row[4])
            cursor.execute("INSERT INTO parts_time (time_id,time_day,time_month,time_year,vendor_idk) VALUES (%s,%s,%s,%s,%s)" % tuple([date_2,row[1],row[2],row[3],date_4]))
    

    【讨论】:

      【解决方案3】:

      您看到的错误是因为您在 csv 中的数据不正确。 在处理 csv 文件时,我总是使用pandas。通过这种方式,您不必考虑您所面临的问题,它会自动为您解决。 将其与executemany 合并,将使您的代码运行得更快。

      import pandas
      df = pd.read_csv('parts_time.txt')
      df.columns = ['time_id', 'time_day', 'time_month', 'time_year', 'vendor_idk'] # You can skip this line if the column names in csv file matches that in Database
      df['time_id'] = df['time_id'].astype(int)
      df['vendor_idk'] = df['vendor_idk'].astype(int)
      cursor.prepare("insert into parts_time(time_id,time_day,time_month,time_year,vendor_idk) values(:1, :2, :3 ,:4, :5)")
      cursor.executemany(None, df.values.tolist())
      

      【讨论】:

        猜你喜欢
        • 2019-05-15
        • 2020-09-09
        • 2015-12-26
        • 1970-01-01
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 1970-01-01
        相关资源
        最近更新 更多