根据条件从文本文件提取列 - python
我有一个用制表符分隔的文件,内容如下:
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()