在我的程序中,我有一个文件,然后我读取for循环中的所有行,检查每一行的开头。然后将每一行添加为变量。这里有40多行,它们几乎都是一样的但是其中一个elif语句并没有返回真实的.startswith无效。无论如何这里的文件内容基本上是一堆保存的信息fN将是我保存的变量,john将是我想要的。所以这个方法就是这样做的,或者假设是
fN:john
fP:1
fE:father email
mN:mother name
mP:1
mE:mother email @ bomg.com
a:1233 adress lane
c:city
s:state
zC:1234534
hP:(1928)phone-1123
cP:1113333
eN:emergancy
eNu:number
c1N:cluubiie 1
c1G:1st
c1B:1-23-34
c2N:clubbie 2
c2G:grade 2
c2B:birth 2
c3N:clubb 3
c3G:grade 3
c3B:birth 3
方法
def fillWindow(self,student):
global fileDirectory
location = os.path.join(fileDirectory, student + '.txt')
file = open(location, 'r')
for line in file.xreadlines():
if line.startswith('fN'):
fN = line.split(':')[1]
elif line.startswith('fP'):
fP = line.split(':')[1]
elif line.startswith('fE'):
fE = line.split(':')[1]
elif line.startswith('mN'):
mN = line.split(':')[1]
elif line.startswith('mP'):
mP = line.split(':')[1]
elif line.startswith('mE'):
mE = line.split(':')[1]
elif line.startswith('a'):
a = line.split(':')[1]
elif line.startswith('c'):
c = line.split(':')[1]
elif line.startswith('s'):
s = line.split(':')[1]
elif line.startswith('zC'):
zC = line.split(':')[1]
elif line.startswith('hP'):
hP = line.split(':')[1]
就在这里即使在文件中有一行以cP
开头,也永远不会返回True
elif line.startswith('cP'):
cP = line.split(':')[1]
print('True')
elif line.startswith('eN'):
eN = line.split(':')[1]
elif line.startswith('eNu'):
eNu = line.split(':')[1]
elif line.startswith('c1N'):
c1N = line.split(':')[1]
elif line.startswith('c1G'):
c1G = line.split(':')[1]
elif line.startswith('c1B'):
c1B = line.split(':')[1]
elif line.startswith('c2N'):
c2N = line.split(':')[1]
elif line.startswith('c2G'):
c2G = line.split(':')[1]
elif line.startswith('c2B'):
c2B = line.split(':')[1]
elif line.startswith('c3N'):
c3N = line.split(':')[1]
elif line.startswith('c3G'):
c3G = line.split(':')[1]
elif line.startswith('c3B'):
c3B = line.split(':')[1]
elif line.startswith('c4N'):
c4N = line.split(':')[1]
elif line.startswith('c4G'):
c4G = line.split(':')[1]
elif line.startswith('c4B'):
c4B = line.split(':')[1]
答案 0 :(得分:8)
您应该考虑这两条线如何相互作用:
elif line.startswith('c'):
...
elif line.startswith('cP'):
此外,您应该考虑使用字典来保存所有值,这样可以大大缩短您的程序。
答案 1 :(得分:6)
这是一段非常糟糕的代码。你真的需要所有这些元素是个体变量吗?为什么不沿着这些方向的字典:
{'fN':'john',
'fP':'1',
...
}
你只能在几行中生成:
dct = {}
f = file(location, 'r')
for line in f:
k, v = line.split(':')
dct[k] = v
答案 2 :(得分:4)
由于您使用elif
作为所有替代品,但第一个替代品,最多只有一个替代品得到评估。对于以cP
开头的行,条件
elif line.startswith('c'):
也将成立,因此不会考虑其他替代方案。
也就是说,将结果存储在字典中可能会更好,可能是这样的:
d = dict(line.split(":", 1) for line in open(location))
答案 3 :(得分:3)
它不起作用,因为以cP
开头的行也以c
开头,并且c
条件放在cP
之前。
您应该更好地重构代码以避免使用long if / elif链。这是非常难以维护的。我会用字典和
results = {}
for line in file:
(key, value) = line.split(':', 1)
results[key] = value
# use results['fN'] for your fN variable
甚至更短:
results = dict(line.split(':', 1) for line in file)
(如果必须使用fN作为独立的局部变量,可以使用
locals().update(line.split(':', 1) for line in file)
但我不推荐它。)
答案 4 :(得分:0)
由于名称fN,fP,fE,mN,mP,....明显是已知且稳定的,并且由于你的函数定义中的 self 背叛你想要创建属性在文件中读取值的实例,由于文件具有CSV格式,我的建议是:
import csv
class A:
def __init__(self):
self.fN = self.fP = self.fE = None
self.mN = self.mP = self.mE = None
self.a = self.c = self.s = None
self.zC = self.hP = self.cP = None
self.eN = self.c1N = self.c1G = None
self.c1B = self.c2N = self.c2G = None
self.c2B = self.c3N = self.c3G = None
self.c3B = None
inst1 = A()
with open('roro.txt','rb') as f:
rid = csv.reader(f,delimiter=':')
for row in rid:
inst1.__dict__[row[0]] = row[1]
print inst1.fP
print inst1.s
print inst1.c3B
请注意,使用内置函数的名称命名对象(即文件)是一种不好的做法,并且不推荐使用 xreadlines()
。
此外,您通过定义global fileDirectory
?
声明global x
指定如果由于在下一行中命名为 x 的分配而完成了对象的创建,则名称 x的对象必须被视为处于全球层面的模块。在您的代码中,没有对 fileDirectory 的分配,并且它更好,因为将 fileDirectory 声明为全局可能会引发意外错误。
请注意,全局级别是更高级别,而不是函数的外部级别。检查以下代码:
class A:
def __init__(self):
self.m = 0.00315879
N = 101
def f(self,x,y):
print 'in f : x==',x," y+10==",y
def g(a,b):
print 'in g : a==',a,' b==',b
global m
global N
m = a*b
N = 5000010000
print 'in g : m = a*b ==',m
print 'in g : N==',N
g(x+300,y+700)
print 'in f, outside g: m==',m
print 'in f, outside g: N==',N
u = A()
u.f(0,40)
print
print 'm at the global level==',m
print 'N at the global level==',N
print 'the instance attribute u.m==',u.m
print 'the class attribute u.N==',u.N
结果
in f : x== 0 y+10== 40
in g : a== 300 b== 740
in g : m = a*b == 222000
in g : N== 5000010000
in f, outside g: m== 222000
in f, outside g: N== 5000010000
m at the global level== 222000
N at the global level== 5000010000
the instance attribute u.m== 0.00315879
the class attribute u.N== 101