[英]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,我希望程序在创建字典时跳过该行。
任何帮助将非常感激!
我建议不要用名称命名字典键,因为名称可以重复。
首先创建主字典,然后遍历 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()] = {}
笔记:
l[0].strip()
因为它的开头或结尾可能有不需要的空格现在,让我们依次添加其他字段:
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.