Вставить разделенные табуляцией значения в базу данных - PullRequest
0 голосов
/ 12 января 2012

У меня есть tab-delimited txt file со строками, разделенными вкладками, и строками, разделенными символами новой строки. Вот как это выглядит на самом деле:

476502291\t\tLF3139812164\t\tTitle 1\tKids & Family\nGRAV_2011\t\tThe Full Picture\tIndependent\n [...etc...]

Обратите внимание, что иногда значения разделяются двумя вкладками вместо одной.

Мне нужно вставить это в таблицу mysql, что должно привести к следующему:

ID             title               genre
476502291      Title 1             Kids & Family
GRAV_2011      The Full Picture    Independent

Как бы я прочитал текстовый файл с разделителями табуляции и запустил цикл for, чтобы вставить значения в таблицу с именем vendor, используя MySQLdb?

>>> import MySQLdb
>>> conn = MySQLdb.connect (host = "localhost",
                             user = "me",
                             passwd = "password",
                             db = "my-db")
>>> cursor = conn.cursor ()
>>> # for loop  # how to read from the txt file to insert it as required?
>>>     # cursor.execute (INSERT...)
>>> conn.commit()
>>> conn.close()

Ответы [ 3 ]

1 голос
/ 12 января 2012

Шаг 1. Считайте модуль csv.http://docs.python.org/library/csv.html. Это делает то, что вы хотите.

with open('your_data_file.dat','r') as source:
    rdr= csv.reader( source, delimiter='\t', quotechar='')
    for row in rdr:
        # you have your columns with which to do your insert.
conn.commit()

Шаг 2. Читайте также о менеджерах контекста.

from contextlib import closing

with open('your_data_file.dat','r') as source:
    rdr= csv.reader( source, delimiter='\t', quotechar='')
    with closing(conn.cursor()) as cursor:
        for row in rdr:
            # you have your columns with which to do your insert.
conn.commit()

Это обеспечит правильную работу курсоров и файлов.закрыты.

1 голос
/ 12 января 2012

Пока вкладки используются только как разделители в вашем файле, вы должны иметь возможность делать что-то вроде этого:

import re

# connect to MySQLdb

with open(file_name) as f:
    for line in f:
        id, title, genre = re.split(r'\t+', line)
        # execute INSERT statement

Идея состоит в том, что у вас всегда будет две группы вкладок, одна между IDи название, и другое между названием и жанром.Используя re.split() на \t+ (одна или несколько вкладок), вы получите список длиной 3 с интересующими вас полями.

Если в вашем файле есть строки, которые не соответствуют этомуперед форматированием вы должны добавить дополнительную проверку, возможно, что-то вроде data = re.split(r'\t+', line) и if len(data) == 3: перед распаковкой кортежа.

edit: Это решение предполагает, что вы не делаетеимеют пустые поля, поэтому, если для строки допустимо иметь только идентификатор и жанр, но без заголовка, это не сработает.Он все равно будет работать, если вы можете иметь заголовок, но без идентификатора или жанра, если есть ведущие вкладки, когда идентификатор отсутствует, и конечные вкладки, когда жанр отсутствует.

0 голосов
/ 06 марта 2013

импорт рег

подключиться к MySQLdb

с открытым (file_name) как f: для строки в f: id, title, genre = re.split (r '\ t +', line) # выполнить инструкцию INSERT

...