【问题标题】:Reading from text file. Making it to a dictionary从文本文件中读取。使它成为字典
【发布时间】:2021-04-15 21:33:00
【问题描述】:

我有一个 sample.txt 文件:

1 7 14
3 3 10
1 1 3

我写的(虽然错了,但至少有一些)(有更好的,但我无法重拍):

content = []
with open ("sample.txt","r",encoding="utf-8") as file:
    for line in file:
        line = file.readline().strip().split(" ")
        mydict = {"A":int(file.readline().strip().split(" ")[0]),
                  "B":int(file.readline().strip().split(" ")[1]),
                  "C":int(file.readline().strip().split(" ")[2])}
        content.append(mydict)

print (content)

预期输出:

[ {"A":1,"B":7,"C":14},{"A":3,"B":3,"C":10},{"A":1,"B":1,"C":3} ]

他们都没有悲伤地工作。 通常有 3 个问题:

  • 当我尝试使用 int() 转换值时
  • 缺少第一行或最后一行(索引问题)
  • 在值上我不能只写 line[0],因为那样它不起作用(为什么?)

我真的是新手,也许对其他和我一样的人和像我一样的菜鸟有好处。

【问题讨论】:

  • 这能回答你的问题吗? convert csv file to list of dictionaries
  • 我希望这是一个家庭作业,教你如何处理文件和字典。否则,我建议根本不要创建这样的字典列表。
  • 您缺少的是for line in file: 已经 一次读取文件一行。每次调用readline() 都会读取 another 行,因此您的输入会比您预期的更快用完。调用readline() 是一种较低级别(且较旧)的方法,是for line in file: 的替代。

标签: python dictionary


【解决方案1】:

你很亲密。 line 变量就是你所需要的:

content = []
with open ("sample.txt","r",encoding="utf-8") as file:
    for line in file:
        line = line.strip().split(" ")
        mydict = {"A":int(line[0]),
                  "B":int(line[1]),
                  "C":int(line[2])}
        content.append(mydict)

print (content)

【讨论】:

    【解决方案2】:

    有一个内置的 csv 阅读器可以很容易地为您处理这个问题

    import csv
    
    result = list(csv.DictReader(open("myfile.csv"),["A","B","C"],delimiter=" "))
    

    【讨论】:

      【解决方案3】:

      你做错的事情是在

      line = file.readline().strip().split(" ")
      

      在这里,您位于循环通过每一行的for 中。检查以下输出

      with open("sample.txt") as file:
          for line in file:
              print(line)
      

      这将打印文件的每一行。 因此,在第一次迭代中,它将在第二个3 3 10 和第三个1 1 3 上打印1 7 14。

      现在您正在遍历每一行但,而您正在阅读下一行。看看这个。

      with open("sample.txt") as file:
          count = 0
          for line in file:
              print(count, "This is current line", line)
              print(count, "This is the next line",file.readline())
              count += 1 # count = count + 1
      

      这只是输出

      0 This is current line 1 7 14
      0 This is the next line 3 3 10
      1 This is current line 1 1 3
      1 This is the next line 
      

      所以你正在做的是一次通过 2 行,因此你正确地得到了一个索引错误。

      相反,您只需删除所有readline 并一次读取一行。这与@quamrana sn-p 几乎相同。

      content = []
      with open ("sample.txt","r",encoding="utf-8") as file:
          for line in file: # Only 1 line at a time
              line = line.strip().split(" ") # .strip() removes all white space in the begging and end and also newlines
              mydict = {"A":int(line[0]),
                        "B":int(line[1]),
                        "C":int(line[2])}
              content.append(mydict)
      

      【讨论】:

      • 谢谢,现在我明白了。但是当你写 line.split(" ").strip() 时它并不好。但是当它是 strip().split(" ") 它工作。为什么? (如果我没记错的话,其中一种方法会列出)
      • 你是对的 line.split(" ") 是一个列表,这是在列表上调用 .strip()。 strip().split(" ") 首先是一个字符串,然后被拆分。这是我的错误。
      【解决方案4】:

      如果你已经在使用pandas:

      import pandas as pd
      
      df = pd.read_csv("sample.txt",sep=' ', header=None)
      df.columns = ['A','B','C']
      print(df.to_dict('records'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-04
        • 1970-01-01
        • 1970-01-01
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多