簡體   English   中英

使用來自 a.csv 文件的數據創建字典

[英]Creating a dictionary using data from a .csv file

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

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

... 等等。

我希望將 this.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消息。

年齡必須是 integer。 如果不是 integer,我希望程序在創建字典時跳過該行。

任何幫助將非常感激!

  1. 我建議不要用名稱命名字典鍵,因為名稱可以重復。

  2. 首先創建主字典,然后遍歷 CSV 中的行。 在每一行中提取名稱人員屬性(您使用了 split 方法 - 它非常適合這里,但不要使用 split( split(",")使用split(", ")) 為每個人創建字典並以這種方式為其分配鍵和值:

    person = {}

    person['age'] = 23

以此類推...然后將這個人的字典作為值分配給主字典,並將鍵設置為人名。 希望它有點幫助!

首先,請記住,您的問題可能有更多“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()

這有效,除非年齡不是 integer,所以我們需要事先使用 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()

為此,我建議使用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)

您可能想查看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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM