【问题标题】:CSV to Python DictionaryCSV 到 Python 字典
【发布时间】:2019-05-18 09:47:45
【问题描述】:

作为家庭作业,我们被要求从 CSV 构建字典(无需导入 CSV 或任何其他库,仅使用内置 Python 函数)。

CSV 看起来像这样:

Class mate, distance1, distance2, distance3, distance4
Bob, 102.5, 0.5587, 45.77, 49.225
Sally, 785.115, 32145.01, 4578.25, 0.5587
Anne, 4521.87, 12.5, 0.2547, 1545.554
...
...
...

我不断收到价值错误,而且没有更多。

race_read = open('student_guess.csv', 'r')
race_open = race_read.readlines()

race_dict = {}

for line in race_open:
    key, val = line.strip().split('\n')
    race_dict[int(key)] = val

    print(race_dict)

这是我得到的回溯的最后两行:

key, val = line.strip().split('\n')
ValueError: not enough values to unpack (expected 2, got 1)

我希望字典看起来像这样:

{'Bob': [102.5, 0.5587, 45.77, 49.225], 'Sally': [785.115, .... etc], etc}

【问题讨论】:

  • 鉴于换行符位于行尾,而您刚刚剥离了它,您预计拆分列表中有多少项?
  • 我预计拆分列表中有4个项目,名称为key。
  • 为什么是四个?你检查是不是真的?如果有 四个,如何将其分配给两个名称?

标签: python python-3.x csv dictionary data-structures


【解决方案1】:

您的代码中的一些问题和一些建议:

  • 您在换行符\n 上进行拆分,它位于行尾,因此您只会在列表中获得一项。您无法从中提取两个项目,因此您会收到 ValueError: not enough values to unpack (expected 2, got 1) 错误
  • 您需要拆分, 而不是\n,因为这些值由, 分隔
  • 您可以使用with 上下文管理器打开文件
  • 您需要使用next()跳过文件的第一行
  • 您可以使用extended iterable unpacking 输出名称和值,然后创建字典

将所有这些放在一起,重构后的代码可能看起来像

race_dict = {}

#Use with to open the file
with open('file.txt', 'r') as race_read:

    #Skip the first line
    next(race_read)

    #Read all lines in a list
    race_open = race_read.readlines()

    #Iterate through the list
    for line in race_open:
        #Extract names and float values by splitting on ,
        key, *val = line.strip().split(',')

        #Convert all strings in val to float
        race_dict[key] = list(map(float, val))

print(race_dict)

所以如果输入文件是

Class mate, distance1, distance2, distance3, distance4
Bob, 102.5, 0.5587, 45.77, 49.225
Sally, 785.115, 32145.01, 4578.25, 0.5587
Anne, 4521.87, 12.5, 0.2547, 1545.554

输出将是

{'Bob': [102.5, 0.5587, 45.77, 49.225], 
'Sally': [785.115, 32145.01, 4578.25, 0.5587], 
'Anne': [4521.87, 12.5, 0.2547, 1545.554]}

【讨论】:

    【解决方案2】:

    文件中的分隔符是逗号,所以 - 首先你需要用逗号分隔 -

    res = line.strip().split(',')
    

    这会给你一个包含 5 个字符串的元组 -

    'Bob', '102.5', '0.5587', '45.77', '49.225'
    

    如果您想按照您的描述将它们添加到字典中,您必须执行以下操作 -

    race_dic[res[0]] = [float(res[1]), float(res[2]), float(res[3]), float(res[4])]
    

    【讨论】:

      【解决方案3】:
      race_read = open('student_guess.csv', 'r')
      race_open = race_read.readlines()
      
      race_dict = {}
      count = 0
      for line in race_open:
          if count==0:
              count = 1
              continue
          line = line.strip().split(',')
          race_dict[line[0]] = line[1:]
      print(race_dict)
      

      输出

      {'Anne': [' 4521.87', ' 12.5', ' 0.2547', ' 1545.554'],
      'Bob': [' 102.5', ' 0.5587', ' 45.77', ' 49.225'],
      'Sally': [' 785.115', ' 32145.01', ' 4578.25', ' 0.5587']}
      

      【讨论】:

        【解决方案4】:

        扎米,

        更正后的代码可能如下所示:

        for line in race_open[1:]: # 1
            splitline = line.split(',') # 2
            splitline = [s.strip() for s in splitline] # 3
            key, val = splitline[0], splitline[1:] # 4
            val = [float(v) for v in val] # 5
            race_dict[key] = val
        print(race_dict)
        
        1. 如果不需要标题,请从 2d 行迭代 race_open。

        2. 你不应该在换行符'\n'处分割你的行,而是在逗号处。使用 split(',')。

        3. 拆分后剥离。

        4. 在构建字典时,提供除第一个以外的所有子列表 项目作为值 [1:]。

        5. 将数值从名称中拆分出来后转换为浮点数

        输出:

        {'Bob': [102.5, 0.5587, 45.77, 49.225], 'Sally': [785.115, 32145.01, 4578.25, 0.5587], 'Anne': [4521.87, 12.5, 0.2547, 1545.554]}
        

        【讨论】:

          猜你喜欢
          • 2021-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-02
          • 2015-08-21
          相关资源
          最近更新 更多