Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将文本文件转换为字典并打印?_Python_Python 3.x_Dictionary - Fatal编程技术网

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'}