将制表符分隔的值插入数据库

时间:2012-01-12 19:37:34

标签: python mysql mysqldump mysql-python

我有一个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

我如何阅读以制表符分隔的txt文件并运行for循环,以便使用MySQLdb将值插入名为vendor的表中?

>>> 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 个答案:

答案 0 :(得分:1)

只要标签仅用作文件中的分隔符,您就应该能够执行以下操作:

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:的行。

编辑:此解决方案假设您没有空白字段,因此如果某个行只有一个ID和一个类型但没有标题是合法的,那么这将无效。只要在缺少ID时有前导选项卡,并且在缺少类型时有尾随选项卡,它仍然可以有标题但没有ID或类型。

答案 1 :(得分:1)

步骤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()

这将确保正确关闭游标和文件。

答案 2 :(得分:0)

import reg

连接到MySQLdb

open(file_name)为f:     对于f中的行:         id,title,genre = re.split(r'\ t +',line)         #cute INSERT语句