【问题标题】:Merging two text files based on a common column in Python基于Python中的公共列合并两个文本文件
【发布时间】:2014-07-12 23:48:13
【问题描述】:

我正在尝试基于公共列合并两个文本文件中的选择列。我这样做是为了将其导入 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 的第 1 列和从 checkins.txt 的第 5 列加入的数据。我是否应该找到一种方法来根据我想要加入的列对两个文本文件中的信息进行排序?

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

【问题讨论】:

  • 为什么不在 SQL 中通过选择连接到新表来执行此操作?
  • 这可能是一个非常愚蠢的问题,但我能做到吗?加入后我可以在数据库中创建一个永久表吗?
  • 对于 MySQL,您需要 INSERT INTO [tablename] SELECT ....。 MySQL 文档在这里:dev.mysql.com/doc/refman/5.6/en/insert-select.html
  • 这对你有用吗?
  • 我仍在尝试将我的一个文件加载到数据库中。它是 79.6MB,当超过等待锁时,我一直被启动。一旦我解决了这个问题,我会告诉你的。我查了一下,看来我可以像你建议的那样轻松加入他们。

标签: python mysql sql csv


【解决方案1】:

在打印之前尝试加入数组:

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

此外,您正在覆盖来自 l 的变量 words。所以,你没有得到你想要的。对于第二个文件的输出,您可能需要类似 words2 = lines.split() 的东西。

【讨论】:

  • 我不确定我是否输入错误,但是当我尝试它时不会生成。
  • 抱歉,您需要将列表中的单个元素包围起来:..."\t".join(word[:] + words[3:5] + words[6:16])我通过将 3 和 4 与 words[3:5] 合并在一起来缩短它。我最初编写它的方式是尝试将字符串附加到 python 中不允许的列表。我还注意到您对列表的命名方式不同(单词和单词)......所以,我对单词的评论有点不正确。不过,在创建具有相似但不同内容的新变量时,最好更清楚
【解决方案2】:

正如 cmets 中提到的,这可以通过简单地选择连接到新表中来实现。

在 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,但这里仍然是错误的方法),然后将其插入回数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2016-01-16
    • 2015-02-27
    • 2020-05-29
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多