根据一些标准从文本文件中提取列 - python

时间:2014-09-10 12:03:22

标签: python dictionary tab-delimited

我有一个制表符分隔文件:

0923    ar blah black sheep 5555    hahahaa
234.231 world
111.11 whatever whatever    123123
whatsoever
03241

我需要把它变成字典结构

  • 第二列是关键
  • 该值是第1列和第3列的元组
  • 任何有1列的内容都不在字典中
  • 忽略前3列之外的任何内容

所需的输出是:

{'ar blah black sheep': ('0923', '5555'), 'whatever whatever': ('111.11', '123123')}

我一直在这样做:

text = """0923  ar blah black sheep 5555    hahahaa
234.231 world
111.11  whatever whatever   123123
whatsoever  
03241"""

result = {}

for i in text.split('\n'):
    columns = i.strip().split('\t')
    if 1 < len(columns) and len(columns) > 2:
        result[columns[1]] = (columns[0], columns[2])

print result

还有另一种方法吗?请记住,文本文件中的行数超过200万行。

2 个答案:

答案 0 :(得分:1)

对于大文件,您可以使用for line in file来处理加载,而不是将整个文件放入内存。

但对于像tsv这样的特定文件类型,您可以使用内置模块csv。 您只需要告诉csv模块您的数据是如何分隔的。

import csv

with open("foo.tsv", "r") as f:
    reader= csv.reader(f, delimiter='\t')   # tell csv to parse a tsv
    for row in reader:
        if len(row) >= 3:   # if we got atleast 3 arguments
            key, value = row[1], (row[0],row[2])    # set the 2nd as key the 1st and 3rd as value
            print('Key:"'+key+'" Value:'+str(value))

答案 1 :(得分:1)

Python csv module是最好的方法。

导入csv,sys

 with open("somefile.txt", 'r') as in_file:
      dialect = csv.Sniffer().sniff(in_file.read(1024)) # detect tab delimiter
      in_file.seek(0) 
      next(reader, none) # skip header
      reader = csv.reader(in_file, dialect) # load file with the determined delimiter

读者将是一种字典格式。你可以使用

 out_file = open("somefile2.txt", 'w')
 writer = csv.writer(out_file)
 for row in reader:
      writer.writerow(row)
 out_file.close()