我的文件格式化为三列数字:
2 12345 1.12345
1 54321 1.54321
3 12345 1.12345
我想让Python使用前两列作为键,并使用第三列作为值。文件很大,这意味着我无法手动格式化。那么如何让Python自动将我的大文件转换为字典?
这是我的代码:
with open ('file name.txt' 'r') as f:
rows = ( line.split('\t') for line in f )
d = { row[0]:row[:3] for row in rows}
print(d)
输出会在整个地方对角打印数字。如何正确格式化?
答案 0 :(得分:0)
你应该试试 -
import pprint
d = {}
with open ('file name.txt','r') as f:
for line in f:
row = line.split('\t')
if len(row) == 3:
d[(row[0], row[1])] = row[2]
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(d)
答案 1 :(得分:0)
香蕉,你很亲密。
open
。row
的第三个成员,即row[2]
。(row[0],row[1])
可以工作。尝试:
with open('filename.txt','r') as f:
rows = ( line.split('\t') for line in f )
d = { (row[0],row[1]):row[2] for row in rows}
for key in d.keys():
print key,d[key]
答案 2 :(得分:0)
首先,您的切片是错误的。您可以使用 var regex = new Regex("[E](((\\d{1,2})))[-][E]?(\\d{1,2})");
var substrings = regex.Split("S03E01-E03");
获得第一个拖链列,使用line[:2]
获得第三个拖链列。
此外,您不需要在单独的数据结构中创建行,您可以在map
中使用解包操作和dict comprehension函数:
line[2]
结果:
with open ('ex.txt') as f:
d={tuple(i):j.strip() for *i,j in map(lambda line:line.split('\t'),f)}
print(d)
请注意,由于{('2', '12345'): '1.12345', ('3', '12345'): '1.12345', ('1', '54321'): '1.54321'}
是列表而列表是不可用的对象,因此您无法将其用作词典键,因此您可以将其转换为*i
。
如果您想保留订单,可以使用collections.OrderedDict
:
tuple
答案 3 :(得分:0)
我不确定你想要键的布局方式。无论如何,您应该使用csv模块,使用'\t'
作为分隔符。
import csv
with open('data.txt') as file:
tsvfile = csv.reader(file, delimiter='\t')
d = { "{},{}".format(row[0], row[1]): row[2] for row in tsvfile }
print(d)
打印出来: {'3,12345':'1.12345','1,54321':'1.54321','2,12345':'1.12345'}
或者,你有这个:
with open('data.txt') as file:
tsvfile = csv.reader(file, delimiter='\t')
d = {}
for row in tsvfile:
d[row[0]] = row[2]
d[row[1]] = row[2]
print(d)
打印出来:
{'54321': '1.54321', '3': '1.12345', '1': '1.54321', '12345': '1.12345', '2': '1.12345'}