在Python中根据共同列合并两个文本文件

1 投票
2 回答
820 浏览
提问于 2025-04-18 07:24

我正在尝试将两个文本文件中的某些列合并,依据一个共同的列。这样做是为了能把数据导入到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方法之前,我并没有这个问题,所以我猜这可能是原因。)

我想要的输出是根据locations.txt中的第一列和checkins.txt中的第五列进行合并的数据。我应该找个方法先根据我想要合并的列对这两个文本文件中的信息进行排序吗?

另外,locations.txt中的第一列和checkins.txt中的第五列不应该有不同的信息,但在checkins.txt中,第五列会有重复的值。有没有合适的方法来处理这个问题?(我希望能保留与locations.txt中第一列值相关的重复项)

2 个回答

0

试着在打印之前把数组连接起来:

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

另外,你在第 l 行覆盖了变量 words。所以,你得不到想要的结果。你可能需要像这样:words2 = lines.split() 来处理第二个文件的输出。

0

正如评论中提到的,这个操作可以通过选择将结果放入一个新表来实现。

在MySQL中,这个操作使用的是INSERT... SELECT 语法,像这样:

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,但这在这里并不是最佳做法),再把结果插入回数据库。

撰写回答