Прочитать из CSV-файла и вставить в базу данных Python - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь прочитать файл 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])

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Кажется, ваш файл содержит пустые строки, потому что вы получаете 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]))
0 голосов
/ 17 декабря 2018

Ошибка, которую вы видите из-за неверных данных в 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())
0 голосов
/ 17 декабря 2018

Попробуйте обработать строку, только если внутри что-то есть:

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...