基于Python中的公共列合并两个文本文件

时间:2014-05-23 14:47:15

标签: python mysql sql csv

我尝试根据公共列合并两个文本文件中的选择列。我这样做是为了将其导入MySQL。显然,在SQL中,这将是一个获取信息的简单查询,但实际上我想要一个具有指定连接的独立永久表,因此我需要为导入创建此文本文件。

这是我目前正在使用的代码:

import csv

with open('locations.txt', 'rb') as l,\
     open('checkins.txt','rb') as c,\
     open('location.txt','w') as location:
     writer = csv.writer(location, delimiter='\t')

    for line in c:
       words = line.split()
    for lines in l:
       word = lines.split()
    writer.writerow([word[:], words[3], words[4], words[6:16]])

以下是示例输出:

['220811', 'Flemington', '2010-10-23'] 59.31297463 '\t' 18.02006155 '\t' ['59.2968', '18.0313', '1.91024672383817', '12420', 'Bandhagen', 'SE']

(顺便说一句,我一直在输出中得到撇号和括号。有没有办法摆脱那些?我没有问题,直到我导入csv并使用括号的writerow方法所以我和#39;我猜这是问题所在。)

我想要的输出是第1列连接的数据,来自locations.txt和第5列,来自checkins.txt。我应该找到一种方法来根据我想要加入的列对两个文本文件中的信息进行排序吗?

此外,第5列的locations.txt中的第1列不应该有任何不同的信息,但checkins.txt文件的第5列中会有重复信息。有没有正确的方法来处理这个? (我想保留与locations.txt中第1列值相关的重复项)

2 个答案:

答案 0 :(得分:0)

在打印之前尝试加入阵列:

writer.writerow("\t".join(word[:] + words[3] + words[4] + words[6:16]))

此外,您正在覆盖l中的变量字。所以,你没有得到你想要的东西。你可能需要像words2 = lines.split()这样的东西来获得第二个文件的输出。

答案 1 :(得分:0)

正如评论中所提到的,只需选择加入新表即可实现。

在MySQL中,它使用INSERT... SELECT syntax,如此:

INSERT INTO New_Table
  SELECT t1.field1, t1.field2, t2.field1
  FROM table1 t1
  INNER JOIN table2 t2 ON t1.PK = t2.table1_FK

因此,出于性能原因,您应该尝试在数据库中保留此类操作,并使您的步骤更容易重复,而不必将查询转储到CSV,然后单独加入查询(尽管您可能已跳过)这一步首先编写连接查询,然后将其输出到CSV,但这仍然是错误的方法)然后将其插回数据库。