2013-11-27 61 views
0

我有一个文件,有几行组成的项目。结构是一个类,然后是类,然后是类中的先决条件。阅读文件和基于分隔符创建字典

#Class, Category, Pre-requisites(amount of them can change) 

MATH 2430, preprofessional, Math 2429|Math 2428, 
Math 2431, professional, Math 2430|Math 2429|Math 2428, 

我想最终得到的是一个类作为一个关键字,然后类别和先决条件作为列表中的值的字典。像

{'MATH 2430' : ['preprofessional', 'Math 2429','Math 2428']...... } 

竖线是迎面而来的先决条件classes.The问题即时运行到的指示器是,数目或垂直条分隔符可能会发生变化,从而在预prequisite类可以通过线而变化。因此,林不知道如何分割基于有多少竖线有

i wrote 
zdic = {} 
pre_req = file.count("|") # to count how many vertical bars appear 
if "|" in file : 
prereq = pre_req 
for line in file : 
    course, category, prereq1(depending on bars...) = split("\W+",file) 

我该如何处理的事实,前必需类的数量可能会有所不同?并根据其中有多少人,相应地分裂来操纵并进入一个词典?

+0

是否有文件尾随逗号? – dawg

+0

是的每一行后面跟着这个逗号 –

回答

0

只需使用split方法即可。假设你有解析行的最后一部分(包含先决条件),如果使用带有正确分隔符的split方法(本例中为|),则不需要计算任何内容。例如,

案例1:

>>> pre_req = "Math 2430|Math 2429|Math 2428" 
>>> pre_req.split("|") 
['Math 2430', 'Math 2429', 'Math 2428'] 

案例2:

>>> pre_req = "Math 2429|Math 2428" 
>>> pre_req.split("|") 
['Math 2429', 'Math 2428'] 

split将分割字符串,并给你所有的先决条件字符串列表,不管有多少是。

下面是你可以去解析任何给定的行的一瞥。我已经使用了stripsplit方法。

>>> line = "MATH 2430, preprofessional, Math 2429|Math 2428," 
>>> line = line.strip().split(",") # This gives you a list of strings 
>>> d = {} 
>>> d[line[0]] = [line[1]] + line[2].strip().split("|") 
>>> d 
{'MATH 2430': [' preprofessional', 'Math 2429', 'Math 2428']} 
+0

但是我想把班级作为一个关键词,所以我需要逗号作为分隔符,然后我想把前提条件作为列表中的一个值来使用 –

+0

@ZachSantiago'split'在那里应用以及。我已经添加了一小段代码来证明这一点。 – slider

0

事情是这样的:

txt='''\ 
MATH 2430, preprofessional, Math 2429|Math 2428, 
Math 2431, professional, Math 2430|Math 2429|Math 2428,''' 

d={} 
for line in txt.splitlines(): 
    line=line.rstrip(',') 
    li=[e.strip() for e in line.split(',')] 
    d[li[0]]=[li[1]]+li[2].split('|') 

print d 
# {'MATH 2430': ['preprofessional', 'Math 2429', 'Math 2428'], 'Math 2431': ['professional', 'Math 2430', 'Math 2429', 'Math 2428']} 

或者更好的是,使用csv

import csv 

d={} 
with open('/tmp/test.csv') as f: 
    for line in csv.reader(f, skipinitialspace=True): 
     d[line[0]]=[line[1]]+line[2].split('|') 
print d 
# {'MATH 2430': ['preprofessional', 'Math 2429', 'Math 2428'], 'Math 2431': ['professional', 'Math 2430', 'Math 2429', 'Math 2428']}