我正在尝试将catalogue.txt文件读入字典。每行包含课程名称,学分数和1h课程的集合,如下所示: CS1P,20,14日,星期一,星期一,15,12日,星期三,星期五,12
我正在使用的功能:
def loadCourseCatalogue ():
data = open ("catalogue.txt", "r+")
print data.read ()
all = {}
line = data.readline ()
while line != "":
line = line.strip ().split (",")
for j in line:
all["course"] = line[0]
return all
print all
loadCourseCatalogue ()
输出应如下所示:
all = {"course": CS1P}
运行此行后:
for j in line:
all["course"] = line[0]
并且像这样:
all = {"course": CS1P, "credits": 20, "timeday": [["Monday", 14], ["Monday", 15], ["Wednesday", 12], ["Friday", 12]]}
在整个第一行完成后。
到目前为止,我已经尝试了所有可能的组合来添加网络上找到的值,但没有任何效果。
答案 0 :(得分:1)
您的第一个print data.read ()
消耗了文件中的所有数据,但没有任何内容,请尝试:
def loadCourseCatalogue ():
infile = open ("catalogue.txt", "r+")
data = infile.read ()
然后处理数据。
答案 1 :(得分:1)
该行:
print data.read ()
使用文件的所有输入并将文件指针放在文件的末尾。后续读取将返回一个空字符串,表示文件的结尾。
我建议您使用for循环迭代文件中的行。另外,由于这些行以逗号分隔,您可以使用csv
模块来帮助将行拆分为单独的字段:
import csv
def loadCourseCatalogue ():
all = {}
with open("catalogue.txt") as data:
for row in csv.reader(data):
all['course'] = row[0]
# extract other fields into all
return all
但是,当处理每一行时,这将覆盖字典all
中的值。相反,您可以将课程代码用作字典中的键,并将每个列表中的其余数据添加到其值(也是字典)中。所以瞄准这个数据结构:
catalogue = {
'CS1P': {'credits': 20,
'timeday': [('Monday', 14),
('Monday', 15),
('Wednesday', 12),
('Friday', 12)]},
'CS2A': {'credits': 40,
'timeday': [('Monday', 10), ('Monday', 11), ('Thursday', 12)]},
#etc,
}
使用此数据结构,您可以轻松查找给定课程的数据:
>>> catalogue['CS1P']
{'credits': 20, 'timeday': [('Monday', 14), ('Monday', 15), ('Wednesday', 12), ('Friday', 12)]}
这里有一些代码可以创建这样的字典:
import csv
from pprint import pprint
def loadCourseCatalogue(data):
catalogue = {}
for row in csv.reader(data):
course = row[0]
catalogue[course] = {
'credits': int(row[1]),
'timeday': zip(row[2::2], (int(i) for i in row[3::2]))
}
return catalogue
with open('catalogue.txt') as f:
catalogue = loadCourseCatalogue(f)
pprint(catalogue)
输入:
CS1P,20,Monday,14,Monday,15,Wednesday,12,Friday,12 CS2A,40,Monday,10,Monday,11,Thursday,12
输出结果为:
{'CS1P': {'credits': 20, 'timeday': [('Monday', 14), ('Monday', 15), ('Wednesday', 12), ('Friday', 12)]}, 'CS2A': {'credits': 40, 'timeday': [('Monday', 10), ('Monday', 11), ('Thursday', 12)]}}
如果你想知道一门课程有多少学分:
>>> catalogue['CS2A']['credits']
40
答案 2 :(得分:0)
您正在覆盖列表而不是将新值附加到列表中。此外,您还应该为第一次迭代提供默认的空列表。 替换:
all["course"] = line[0]
使用:
all["course"] = all.get("course", []).append(line[0])
还要避开print data.read()
,因为它会读取所有文件,并且不会为后续readline
留下任何内容。如果你想让它在打印后使用data.seek(0)
。
答案 3 :(得分:0)
如上所述,这将替换每行的字典键course
,最后您的字典中最后只会有一行。
您可以通过使all
列表,每个值是表示一行的dict,或者如果您的课程名称都是唯一的,您可以使用课程名称本身作为dict键来修复它,并且它的价值是该课程属性的一个词。
答案 4 :(得分:0)
def loadCourseCatalogue ():
all_cources={}
data = open("catalogue.txt","r").readlines()
for line in data:
_all={}
_all['credits']=line.split(',')[1]
_all['timeday']=line.split(',')[2:]
all_cources[line.split(',')[0]]=_all
return all_cources
答案 5 :(得分:0)
我想你想做这样的事情:
import csv
from pprint import pprint
def pairwise(iterable):
"s -> [[s0,s1], [s2,s3], [s4, s5], ...]"
a = iter(iterable)
return [list(pair) for pair in zip(a, a)]
def loadCourseCatalogue():
all = {}
with open ("catalogue.txt", "r+") as data:
for row in csv.reader(data):
all[row[0]] = {'credits': row[1], 'timeday' : pairwise(row[2:])}
pprint(all)
return all
catalogue = loadCourseCatalogue()
出于测试目的,我将数据文件示例扩展为:
CS1P,20,Monday,14,Monday,15,Wednesday,12,Friday,12
CS2P,19,Monday,13,Monday,14,Wednesday,11,Friday,11
CS3P,18,Monday,12,Monday,13,Wednesday,10,Friday,10
产生了以下输出:
{'CS1P': {'credits': '20',
'timeday': [['Monday', '14'],
['Monday', '15'],
['Wednesday', '12'],
['Friday', '12']]},
'CS2P': {'credits': '19',
'timeday': [['Monday', '13'],
['Monday', '14'],
['Wednesday', '11'],
['Friday', '11']]},
'CS3P': {'credits': '18',
'timeday': [['Monday', '12'],
['Monday', '13'],
['Wednesday', '10'],
['Friday', '10']]}}