【问题标题】:Comparing two text files to remove duplication of the longer one比较两个文本文件以删除较长文本文件的重复
【发布时间】:2014-11-02 06:39:02
【问题描述】:

我有两个文件,一个包含由制表符分隔的数据列表,第二个包含一个项目 id 的列表,这是一个字段。我想将较大文件(file1)中的每个第一个字段与最小文件(file2)中的所有行/项目 id 进行比较,然后如果比较的 id 在第二个文件中不存在,我想写所有相关信息第一个文件中的比较项(这是由制表符分隔的行内容)。我尝试了下面的代码,但我遇到了 for 循环的问题。第一个循环不会增加,而第二个 for 循环所有第二个文件行。另外,我希望项目编号只写一次,这是 If 语句中的一个问题。

for lines in alldata:
  for lines1 in olddata:
    old_data=lines1.split('\r\n')
    dataId=old_data[0]
    data=lines.split('\t')
    photoid=data[0]
    if photoid==dataId:

     break

    else:
     #continue
     #print('matching',lines)
     #break
      w=open(head+'......................../1.txt','a')
      w.write(lines)  

这是文件结构的示例:

15463774518 2014-10-28 08:12:31 2014-10-28 13:12:31 
15628560471 2014-10-26 07:40:28 2014-10-26 12:40:28 
15444098878 2014-10-26 04:49:19 2014-10-26 09:49:19 
15437269197 2014-10-25 09:55:11 2014-10-25 15:55:11 

小文件看起来像:

139747955
2417570005
2478707302
1808883457
211514265

【问题讨论】:

  • 查看文件内容的样本会非常有帮助。另外,你能给出文件大小的指针吗?它们是否足够小以存储在内存中?
  • 文件有不同的大小,因为我使用不同大小的数据,对于大文件,最小。大小为 50KB,其中一些文件超过 5 MB。较小的文件最大为 20KB。

标签: python file comparison


【解决方案1】:

我建议遵循伪代码。检查 id 文件 1 是否在 id 文件 2 中的 Pythonic 方法是拥有来自文件 2 的 id 列表并说 if id in idlist:

假设您已将第二个文件的所有 ID 读取到列表 idlist_file2。 然后你阅读文件一。解析你的行并简单地检查

with open(file1,'r') as f:
    for line in f:
        data = parse_line(line) # function according to your data format, either return a dict or a tuple what ever works best for you
        if date['id'] not in idlist_file2:
             do_something_with_this_info(data)

这应该会给你一个很好的起点。

【讨论】:

    【解决方案2】:

    我很想将第二个文件加载到字典中,然后解析第一个文件并尝试将行的第一列与字典键匹配

    keys_dict = {}
    f = open('smallfile.txt','r')
    for line in f.readlines():
        keys_dict[line] = 1
    f.close()
    

    我不是这里的超级pythonista,但你应该明白这一点。

    然后当你阅读你的大文件时,检查一下

    if first_column_value in keys_dict:

    【讨论】:

    • 为了匹配我会遇到字典中\r\n的问题。
    • 您可以使用 string.replace("\r\n", "") 或 strip("\r\n") 删除它们
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多