Python 如何从文本文件的每一行创建列表字典?

Python 如何从文本文件的每一行创建列表字典?,python,dictionary,Python,Dictionary,我有一个包含这些数据的文本文件 1, Jane Doe, 1991 2, Sam Smith, 1982 3, John Sung, 1965 4, Tony Tembo, 1977 我有类似的东西,但它只有在你只有ID和名字的情况下才起作用 names = {} with open("dict.txt") as f: for line in f: (key, val) = line.strip().split(',') names[int(ke

我有一个包含这些数据的文本文件

1, Jane Doe, 1991
2, Sam Smith, 1982
3, John Sung, 1965
4, Tony Tembo, 1977
我有类似的东西,但它只有在你只有ID和名字的情况下才起作用

names = {}
with open("dict.txt") as f:
  for line in f:
      (key, val) = line.strip().split(',')
      names[int(key)] = val
印刷品(d) 我是否可以从该文件创建一个如下所示的词典:

{1: [Jane Doe, 1991], 2: [Sam Smith, 1982]...}
最好在处理逗号分隔的数据时使用该模块

导入csv
数据文件='test.csv'
已解析={}
打开(数据文件)作为数据:
reader=csv.reader(数据)
对于读取器中的行:
打印(行)
#行为['1','Jane Doe','1991']
已分析的[行[0]]=行[1:]
打印(已解析)
['1','Jane Doe','1991']
['2','Sam Smith','1982']
['3'、'John Sung'、'1965']
['4','Tony Tembo','1977']
{'1':['Jane Doe','1991','2':['Sam Smith','1982','3':['John Sung','1965','4':['Tony Tembo','1977']]
读取器
将行内容作为列表返回。然后,只需将第一个列表元素存储为dict键,将其余列表元素(
[1://code>)存储为dict值

现在,上面的代码以
str
的形式读取所有内容,并且正如您所注意到的,还包括文件中的额外空格。如果您需要具有特定类型的键和值(并且需要列表容纳不同类型的元素),则需要分别解析它们:

打开(数据文件)作为数据:
reader=csv.reader(数据)
对于读取器中的行:
打印(行)
#行为['1','Jane Doe','1991']
key=int(第[0]行)
名称=行[1]。条带()
年份=整数(第[2]行)
解析的[键]=[名称,年份]
打印(已解析)
['1','Jane Doe','1991']
['2','Sam Smith','1982']
['3'、'John Sung'、'1965']
['4','Tony Tembo','1977']
{1:['Jane Doe',1991],2:['Sam Smith',1982],3:['John Sung',1965],4:['Tony Tembo',1977]}
当然,如果有更多包含不同类型数据的列,则需要调整索引和类型强制

更进一步,我将把解析实际数据和类型强制的代码放在一个类中(确切地说是a)。这样,读取文件与解析实际内容是分开的:

导入csv
从数据类导入数据类
@数据类
班长:
索引:int
姓名:str
年份:整数
#这只是一个匹配示例数据的示例。
#根据需要添加更多类型检查和错误处理。
定义后初始化(自):
#如果我们没有得到一个整数,强制它为整数
#如果int(…)失败,将引发ValueError
如果不是isinstance(self.index,int):
self.index=int(self.index)
如果不存在(自身年份,整数):
self.year=int(self.year)
#清理多余的空间
self.name=self.name.strip()
数据文件='test.csv'
已解析={}
打开(数据文件)作为数据:
reader=csv.reader(数据)
对于读取器中的行:
打印(行)
#行为['1','Jane Doe','1991']
#解包行内容并传递给人员的_init__
#确保它与数据类字段的顺序匹配
人员=人员(*行)
解析的[person.index]=[person.name,person.year]
打印(已解析)
['1','Jane Doe','1991']
['2','Sam Smith','1982']
['3'、'John Sung'、'1965']
['4','Tony Tembo','1977']
{'1':['Jane Doe','1991','2':['Sam Smith','1982','3':['John Sung','1965','4':['Tony Tembo','1977']]
处理逗号分隔的数据时,最好使用该模块

导入csv
数据文件='test.csv'
已解析={}
打开(数据文件)作为数据:
reader=csv.reader(数据)
对于读取器中的行:
打印(行)
#行为['1','Jane Doe','1991']
已分析的[行[0]]=行[1:]
打印(已解析)
['1','Jane Doe','1991']
['2','Sam Smith','1982']
['3'、'John Sung'、'1965']
['4','Tony Tembo','1977']
{'1':['Jane Doe','1991','2':['Sam Smith','1982','3':['John Sung','1965','4':['Tony Tembo','1977']]
读取器
将行内容作为列表返回。然后,只需将第一个列表元素存储为dict键,将其余列表元素(
[1://code>)存储为dict值

现在,上面的代码以
str
的形式读取所有内容,并且正如您所注意到的,还包括文件中的额外空格。如果您需要具有特定类型的键和值(并且需要列表容纳不同类型的元素),则需要分别解析它们:

打开(数据文件)作为数据:
reader=csv.reader(数据)
对于读取器中的行:
打印(行)
#行为['1','Jane Doe','1991']
key=int(第[0]行)
名称=行[1]。条带()
年份=整数(第[2]行)
解析的[键]=[名称,年份]
打印(已解析)
['1','Jane Doe','1991']
['2','Sam Smith','1982']
['3'、'John Sung'、'1965']
['4','Tony Tembo','1977']
{1:['Jane Doe',1991],2:['Sam Smith',1982],3:['John Sung',1965],4:['Tony Tembo',1977]}
当然,如果有更多包含不同类型数据的列,则需要调整索引和类型强制

更进一步,我将把解析实际数据和类型强制的代码放在一个类中(确切地说是a)。这样,读取文件与解析实际内容是分开的:

导入csv
从数据类导入数据类
@数据类
班长:
索引:int
姓名:str
年份:整数
#这只是一个匹配示例数据的示例。
#根据需要添加更多类型检查和错误处理。
定义后初始化(自):
#如果我们没有得到一个整数,强制它为整数
#如果int(…)失败,将引发ValueError
如果不是isinstance(self.index,int):
self.index=int(self.index)
如果不存在(自身年份,整数):
self.year=int(self.year)
#清理多余的空间
d = {} # this is the dictonary
file = open("data.txt") # open file
for line in file:
    s = line.split() # split line
    # get data individually
    key = s[0] 
    fullname = s[1] + ' ' + s[2]
    year = s[3]
    # append to dictionary
    d[key] = [fullname, year]
# print
print(d)