2013-06-07 4 views
0
with open((path + 'stuff.csv'),'r+') as fin1: 
    dr1 = csv.DictReader(fin1) 
    create1="CREATE TABLE LGD (" 
    exe1="INSERT INTO LGD (" 
    for a in dr1.fieldnames: 
     if a=='': 
      pass 
     elif ' ' in a: 
      create1+=a.replace(" ","")+',' 
      exe1+=a.replace(" ","")+',' 
     else: 
      create1 += a + "," 
      exe1+= a + "," 
    create1 = create1[:-1] 
    exe1=exe1[:-1] 
    create1 +=");" 
     exe1+=") VALUES (" 
    for a in range(len(dr1.fieldnames)-1): 
     exe1+='?'+"," 
    exe1=exe1[:-1] 
    exe1+=");" 
    cur.execute(create1) 
    to_db1 = [(a[dr1.fieldnames[0]],a[dr1.fieldnames[1]],a[dr1.fieldnames[2]],a[dr1.fieldnames[3]],a[dr1.fieldnames[4]]) for a in dr1] 
    cur.executemany(exe1,to_db1) 
    conn.commit() 

ok Моя цель - импортировать каждый документ csv в виде таблицы в базу данных sqlite. Скажем, у меня их 100.динамический csv to sqlite импорт

Прямо сейчас мой код динамически пишет строки, но как я могу создать список to_db1, поэтому мне не нужно определять, сколько столбцов есть?

конкретно эта линия

to_db1 = [(a[dr1.fieldnames[0]],a[dr1.fieldnames[1]],a[dr1.fieldnames[2]],a[dr1.fieldnames[3]],a[dr1.fieldnames[4]]) for a in dr1] 

Я видел этот вопрос, но мой отличаются, потому что имена полей имеют пробела в них, и они не могут быть takenout как многие из документов неизменяемые. Я также не хочу потерять форматирование списка, показанное ниже.

[(stuff,stuff,stuff),(stuff,stuff,stuff)] 

Dynamically import columns from csv into database table in sqlite3 and python

переформулировать мой вопрос, я хочу, чтобы создать список to_db1 без определения имен столбцов во время компиляции. он должен создать его в этом формате

[(stuff,stuff,stuff),(stuff,stuff,stuff)] 

во время выполнения.

+0

Я не совсем понимаю ваш вопрос. Прежде чем создать таблицу, вы, конечно, узнаете, сколько столбцов необходимо (можно динамически добавлять новые столбцы, но я думаю, что это не решит вашу проблему). –

+0

Линия, на которую я конкретно указывал, проходит через csv и захватывает содержимое для каждой строки и добавляет их в список. Во время выполнения я хочу, чтобы он создал список без меня, определяя ключи, так что ex.a [dr.fieldnames [** 0 **]] –

ответ

1

Чтобы получить имена полей без пробелов и уже присоединился к запятой, вы можете использовать список понимание:

names = ['my _id', 'some a', 'some b'] 
sanitized_names = "({})".format(", ".join(x.replace(' ','') for x in names)) 

# => (my_id, somea, someb) 

От там, вы можете использовать ответ, который вы связаны с.

Чтобы получить кортежи из dicts в dr1, приказал как dr1.fieldnames, используйте [tuple(a[x] for x in dr1.fieldnames) for a in dr1].

+0

Я думаю, вы неправильно поняли мой вопрос, посмотрите на строку, на которую я конкретно указываю. Мой код уже занимает пробелы для заголовков столбцов таблицы. Однако ключи не могут быть изменены и должны иметь правильные пробелы для захвата содержимого csv. –

+0

Я думаю, что сделал. Я обновил свой ответ, решает ли ваша проблема? –

+0

Да, это было, был еще один столбец, где заголовок и значения - '', но это не имеет значения, просто назвал столбец бесполезным в таблице. Спасибо –

Смежные вопросы