Python 如何将文本文件转换为字典并打印?
我的文件格式为三列数字:Python 如何将文本文件转换为字典并打印?,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我的文件格式为三列数字: 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 )
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)
输出按对角线方向打印整个位置的数字。如何正确设置格式?您应该试试-
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)
香蕉,你接近了
open
的参数行的第三个成员,即行[2]
(第[0]行、第[1]行)
首先,您的切片是错误的。您可以使用
行[:2]
获得第一个拖列,使用行[2]
获得第三个拖列
此外,您不需要在单独的数据结构中创建行,您可以在以下文件中使用解包操作和函数:
结果:
{('2', '12345'): '1.12345', ('3', '12345'): '1.12345', ('1', '54321'): '1.54321'}
请注意,由于*i
是一个列表,而列表是不可损坏的对象,因此不能将其用作字典键,以便将其转换为元组
如果你想保持秩序,你可以使用:
我不确定你到底想要怎样的布局键。无论如何,您应该使用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)
打印出:
{'312345':'1.12345','154321':'1.54321','212345':'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'}
看起来示例的第一行将创建一个键“2”
和一个值['2','12345','1.12345']
。这就是你的意图吗?至于打印,将字典发送到标准的print()
函数不会自动格式化它,因此您必须决定如何打印并实现它。您能给出所需输出的示例吗?也许可以帮助一些人格式化。伙计,你需要把输出的例子。你打算怎么查这本字典@TigerhawkT3已经提出了一个可以按顺序处理的解决方案。否则,你必须创建dict of dict,并定义你想要访问哪些值的键。是的,在@TigerhawkT3,这正是我的意图,至少是我的教授想要的。也许有一种更简单的方法来解决这个问题?请让我知道。这种“口授式”的想法似乎很有希望。你们能详细说明一下吗?这不会比OP的字典打印得更整洁(我也不确定这是他们想要的字典结构)。没错,但它确实解决了OP代码中的逻辑问题,至少根据他的要求。我认为使用pprint是他问题的答案。这会格式化字典并在屏幕上正确打印。显然,这会导致“IndexError=列表索引超出范围”。我想我该怎么办?我怀疑问题1是一个复制粘贴错误,因为如果他们的程序中有这样的错误,我想他们会得到一个回溯,说'filename.txtr
不存在。顺便说一句,这种方法包括换行符“\n”作为每个字典值的最后一个字符。要避免这种情况,请在rows=(line.strip().split('\t')中为f中的行使用strip()
,或d={(row[0],row[1]):row[2]。strip()为row}
。很好的字典理解,但是。你能解释为什么我总是得到错误“IndexError:list index out of range?”这与我的文件有关吗。如果是,有什么问题@rjonnalIt可能是因为文件中的一行只有两个值,但如果没有数据文件,我无法再现错误。您能帮我吗?你的输出是我想要的输出。但是你能详细解释一下你的解释吗?@Banana0101什么部分是不明确的?我在上面插入了你例子的部分,并在输出中得到了标点符号@Kasra@Banana0101对不起,我没明白你的意思?我说你不懂代码的哪一部分?我是新手。如果这有意义的话,我无法完全掌握如何将我的代码合并到您上面给出的示例中@卡斯拉
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)
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'}