.starts с не работает - PullRequest
       92

.starts с не работает

0 голосов
/ 29 марта 2011

В моей программе у меня есть файл, а затем я читаю все строки в цикле 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]

прямо здесь True никогда не возвращается, даже если в файле есть строка, начинающаяся с cP

        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]

Ответы [ 5 ]

8 голосов
/ 29 марта 2011

Вы должны подумать о том, как эти две строки взаимодействуют:

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

Кроме того, вы должны изучить использование словаря для хранения всех ваших значений, вы можете резко сократить вашу программу.

6 голосов
/ 29 марта 2011

Это довольно ужасный кусок кода.Вам действительно нужны все эти элементы, чтобы быть отдельными переменными?Почему бы не создать словарь в следующих строках:

{'fN':'john',
 'fP':'1',
   ...
}

, который вы можете создать всего за пару строк:

dct = {}
f = file(location, 'r')
for line in f:
    k, v = line.split(':')
    dct[k] = v
4 голосов
/ 29 марта 2011

Поскольку вы используете elif для всех альтернатив, кроме первой, оценивается не более одной из альтернатив. Для строки, начинающейся с cP, условие

elif line.startswith('c'):

также будет иметь место, поэтому ни одна из дальнейших альтернатив не будет рассмотрена.

Тем не менее, вам лучше хранить результаты в словаре, например, вот так:

d = dict(line.split(":", 1) for line in open(location))
3 голосов
/ 29 марта 2011

Не работает, потому что строка начинается с 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)

но я не рекомендую это.)

0 голосов
/ 29 марта 2011

Поскольку имена 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

Обратите внимание, что присвоение имени объекту с именем встроенной функции (то есть дляскажем, file ) - плохая практика, и что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...