Python .开始时不工作

Python .开始时不工作,python,file-io,for-loop,if-statement,Python,File Io,For Loop,If Statement,在我的程序中,我有一个文件,然后我阅读for循环中的所有行,检查每一行的开头。然后将每一行作为变量添加。这里面有40多行,它们几乎都是一样的,但是其中一条elif语句没有返回真的.startswith不起作用。总之,这里是文件内容,基本上是一堆保存的信息,fN是我保存的变量,john是我想要的。所以这个方法就是这样做的,或者说它是假设的 fN:john fP:1 fE:father email mN:mother name mP:1 mE:mother email @ bomg.com a:12

在我的程序中,我有一个文件,然后我阅读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
,因此最多会对其中一个备选方案进行评估。对于以
cP
开头的行,条件

elif line.startswith('c'):
也将保持,因此不会考虑其他替代方案

也就是说,您最好将结果存储在字典中,可能如下所示:

d = dict(line.split(":", 1) for line in open(location))

它不起作用,因为行以
cP
开头,也以
c
开头,并且您将
c
条件置于
cP
之前


您最好重构代码,以避免长的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)

但是我不推荐。)

您应该考虑这两条线是如何相互作用的:

elif line.startswith('c'):
...
elif line.startswith('cP'):

另外,你应该考虑使用字典来保存你所有的值,你可以大大缩短你的程序。

这是一段非常可怕的代码。你真的需要所有这些元素都是单独的变量吗?为什么不写一本这样的字典呢

{'fN':'john',
 'fP':'1',
   ...
}
您只能在几行代码中生成:

dct = {}
f = file(location, 'r')
for line in f:
    k, v = line.split(':')
    dct[k] = v

由于名称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 x
指定,如果由于在下一行中对namex进行了赋值而完成了对象的创建,则namex的对象必须被视为处于全局级别的模块中。在您的代码中没有对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

line.split(“:”,1)
如果该值包含另一个冒号,则可能更可取。Idk如果您使用了Tkinter,但我正在尝试将所有这些变量放入不同的输入框中,我认为我无法使用字典来实现这一点。或者更可能我不知道how@Brandon:为什么不能将字典与Tkinter一起使用?要将字符串添加到输入框中,必须使用string.insert(),如果所需的所有字符串都在字典中,我不知道该怎么做。dumb question dict[key]返回一个只响应全局变量question的字符串。这是因为程序的许多不同部分都需要文件目录,所以我将其设置为全局目录variable@Brandon好的,但是名为fileDirectory的对象是在什么级别创建的?我们在函数fillWindow()编写时没有看到这种创建。如果在下一行中没有创建赋值,则global语句是无用的,据我所知,global语句idk级别的名称是什么,但它是最高的,就在imports@Brandon如果名为fileDirectory的对象是在最高级别创建的(您指的是名为_main_的模块,不是吗?),那么,较低级别中的语句
globalfiledirectory
是完全无用的。您应该研究Python管理变量的方式(在文档中“variable”表示“name”),():“当在代码块中使用名称时,使用最近的封闭作用域来解析它。代码块可见的所有此类作用域的集合称为块的环境。”@Brandon这意味着如果函数g中定义了函数h()()是在模块M中定义的函数f()中定义的,在h()的主体中的语句中包含名称(也称为“变量”)X会触发解释器在函数h()的命名空间中搜索X和X指向的对象之间的绑定,如果在这个名称空间中找不到X,那么Python将在封闭范围内搜索,也就是说在函数g()的名称空间中;
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