【问题标题】:Creating a dictionary using data from a .csv file使用 .csv 文件中的数据创建字典
【发布时间】:2021-01-03 03:22:38
【问题描述】:

我有一个20行的.csv文件,每一行的格式如下:

Lucy, 23, F, diabetes
Darwin, 60, M, hypertension
Dave, 35, M, epilepsy
Tiffany, 12, F, asthma

...等等。

我希望将此 .csv 文件转换为字典,如下所示:

dict = {
     'Lucy':{
           age: 23
           gender: 'F'
           condition: 'diabetes'
      },
     'Darwin':{
           age: 60
           gender: 'M'
           condition: 'hypertension'
      },
      #(and so on for all 20 lines)
}

每一行的格式为:姓名、年龄、性别、状况。这是我迄今为止尝试过的。

dict ={}
f = open("medical.csv', mode = "rt", encoding = "utf8")
s = f.readline()
for line in f:
    line.split(",")

...这就是我停下来的地方。我无法弄清楚如何将标题分配给该行中的每个值,以便字典将如上显示,带有标签“年龄”、“性别”和“条件”。当我运行代码时,“medical.csv”上有一条SyntaxError: invalid syntax 消息。

年龄必须是整数。如果不是整数,我希望程序在创建字典时跳过该行。

任何帮助将不胜感激!

【问题讨论】:

  • 注意你要line.split(", "),加上空格。
  • “medical.csv”与“medical.csv”

标签: python


【解决方案1】:
  1. 我建议不要使用名称来命名您的字典键,因为名称可以重复。

  2. 首先创建主字典,然后遍历 CSV 中的行。在每一行中提取姓名人员属性(您使用了 split 方法 - 它非常适合这里!但不要使用 split(",") 使用 split(", "))。为每个人创建字典并以这种方式为其分配键和值:

    person = {}

    person['age'] = 23

等等…… 然后将此人的字典作为值分配给主字典,并将键设置为人名。希望对您有所帮助!

【讨论】:

    【解决方案2】:

    我建议为此使用csv 模块。请注意方便的 skipinitialspace 参数。

    import csv
    from pprint import pprint
    
    
    def row_to_dict(ts):
        return {k: t for k, t in zip(("age", "gender", "condition"), ts)}
    
    
    if __name__ == "__main__":
        result = {}
        with open("medical.csv") as f:
            reader = csv.reader(f, skipinitialspace=True)
            for row in reader:
                name, data = row[0], row[1:]
                result[name] = row_to_dict(data)
    
        pprint(result)
    

    【讨论】:

      【解决方案3】:

      首先,请记住,您的问题可能有更多“pythonic”的答案。

      嗯,你是在正确的道路上:

      dict ={}
      f = open("medical.csv", mode = "rt", encoding = "utf8")
      s = f.readline()
      for line in f:
          l = line.split(",")
      

      让我们将结果命名为line.split(",") (l)。 现在l 是这种格式:

      l[0] 包含名称 l[1] 包含年龄 l[2] 包含性别 l[3] 包含条件。

      现在,l 的第一个元素是名称,所以让我们将其添加到字典中:

      dict[l[0].strip()] = {}

      注意:

      1. 我使用 l[0].strip() 是因为它的开头或结尾可能有不需要的空格
      2. 我正在字典中初始化一个新字典(您想要的数据结构是字典的字典)

      现在,让我们依次添加其他字段:

      dict[l[0].strip()]['gender'] = l[2].strip()
      dict[l[0].strip()]['condition'] = l[3].strip()
      

      这可行,除非年龄不是整数,所以我们需要事先使用 try except 块:

      try: 
          age = int(l[1].strip())
      except ValueError:
          continue    # You want to skip the current iteration, right?
      

      现在我们可以把所有东西放在一起,稍微润色一下代码:

          dict ={}
          f = open("medical.csv", mode = "rt", encoding = "utf8")
          s = f.readline()
          for line in f:
              l = line.split(",")
              age = -1
              try:
                  age = int(l[1].strip())
              except ValueError:
                  continue
              key = l[0].strip()
              dict[key]['age'] = age
              dict[key]['sex'] = l[2].strip()
              dict[key]['condition'] = l[3].strip()
      

      当然,这假设所有名称都不同(我刚刚阅读了 firanek 的回答:我同意她/他的观点,即您不应该使用名称作为密钥,使用这种方法,您会丢失所有关于除了最后一个之外,所有同名的人)

      哦,我差点忘记了:你可以使用 dict 构造函数并替换 dict[keys][<string>] = <thing> 行: dict[key] = {'age' = age, 'sex' = l[2].strip(), 'condition' = l[3].strip().

      【讨论】:

        【解决方案4】:

        您可能想查看 Pandas 库,并使用 DataFrames 操作数据,因为它具有许多内置功能。

        import pandas as pd
        data=pd.read_csv("data.csv", header=None ,names=["Name", "Age", "Gender", "Condition"], index_col=False, na_values=",NaN, null", verbose=True)
        data=pd.DataFrame(data)
        newdata=data.dropna(subset=['Age'])
        print("new data: \n", newdata)
        

        还有一个类似的问题:Pandas: drop columns with all NaN's

        【讨论】:

          猜你喜欢
          • 2019-01-06
          • 2016-09-03
          • 1970-01-01
          • 1970-01-01
          • 2011-10-08
          • 2012-12-15
          • 2012-01-02
          • 2016-11-22
          相关资源
          最近更新 更多