首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.startswith不工作

.startswith不工作
EN

Stack Overflow用户
提问于 2011-03-29 16:02:55
回答 5查看 2.2K关注 0票数 0

在我的程序中,我有一个文件,然后读取for循环中的所有行,检查每一行的开头内容。然后将每一行添加为变量。这里有40多行代码,它们几乎是一样的,但是其中一个elif语句不返回true,.startswith不工作。无论如何,这里是文件内容,基本上是一堆保存的信息,fN将是我保存的变量,john将是我所希望的。所以这个方法就是这样做的,或者应该是

代码语言:javascript
复制
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

方法

代码语言:javascript
复制
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]

这里的

永远不会返回True,即使在文件中有一行以cP开头

代码语言:javascript
复制
        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]
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-29 16:07:17

它不起作用,因为以cP开头的行也以c开头,您将c条件放在cP之前。

您应该更好地重构代码,以避免冗长的if/elif链。它是非常不可维护的。我会用字典

代码语言:javascript
复制
 results = {}
 for line in file:
    (key, value) = line.split(':', 1)
    results[key] = value

 # use results['fN'] for your fN variable

甚至更短:

代码语言:javascript
复制
 results = dict(line.split(':', 1) for line in file)

(如果必须使用fN作为独立局部变量,则可以使用

代码语言:javascript
复制
 locals().update(line.split(':', 1) for line in file)

但我不推荐。)

票数 3
EN

Stack Overflow用户

发布于 2011-03-29 16:08:10

您应该考虑这两行是如何交互的:

代码语言:javascript
复制
elif line.startswith('c'):
...
elif line.startswith('cP'):

此外,您应该研究使用字典保存所有的值,您可以大大缩短您的程序。

票数 8
EN

Stack Overflow用户

发布于 2011-03-29 16:10:38

那是一段相当可怕的代码。你真的需要所有这些元素成为单独的变量吗?为什么不写一本这样的字典:

代码语言:javascript
复制
{'fN':'john',
 'fP':'1',
   ...
}

您只可以在几行代码中生成:

代码语言:javascript
复制
dct = {}
f = file(location, 'r')
for line in f:
    k, v = line.split(':')
    dct[k] = v
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5475472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档