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

问题描述:

我有一个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() 
+0

“主要是无法做for循环”有什么问题?所有工作完成后,提交通常会持续最后。这是你的问题吗?在哪里提交?或者你想知道如何阅读带有分隔符分隔符的CSV文件?你有没有读过Python的'csv'模块? – 2012-01-12 19:40:01

+0

感谢您的回复。后者。 – David542 2012-01-12 19:40:31

+0

有没有空白字段?也就是说,\ t \ t总是等于'\ t',或者'\ t \ t'有时是指“分隔符,空白字段,分隔符”? – ruakh 2012-01-12 19:42:44

第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() 

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

只要选项卡只用作文件分隔符,你应该能够做这样的事情:

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 

的想法是,你将永远有两组选项卡,一个在标题和标题之间,以及标题和类型之间的另一个。通过使用re.split()\t+(一个或多个选项卡),你会得到一个长度为3的列表,你感兴趣的领域。

如果在您的文件不符合此格式,您应该添加一些额外的任何线检查,可能是在元组解开之前沿着data = re.split(r'\t+', line)if len(data) == 3:的行。

编辑:这个解决方案假设你没有空白字段,所以如果一行只有一个ID和一个流派,但没有标题是合法的,这是行不通的。只要缺少标识时有前导标签,缺少流派时标签尾随标签,只要标题没有标识或流派,它仍然可以工作。

进口REG

具有开放(FILE_NAME)连接到MySQLdb的

为f: 在F线:0​​ID,标题,流派= re.split(R '\吨+',线) #执行INSERT语句