根据条件从文本文件提取列 - python

0 投票
2 回答
556 浏览
提问于 2025-04-20 20:57

我有一个用制表符分隔的文件,内容如下:

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

我想把它变成一个字典结构,要求是:

  • 第二列作为字典的键
  • 值是一个包含第一列和第三列的元组
  • 只有一列的内容不需要放进字典
  • 第一到第三列以外的内容都不需要考虑

我想要的输出结果是:

{'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 个回答

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

Python的csv模块是处理CSV文件的最佳方法。

首先,你需要导入csv和sys这两个库:

import 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

使用这个模块读取CSV文件时,得到的数据会以字典的格式呈现。你可以使用

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

撰写回答