поиск по списку файлов python (у меня есть две совпадающие строки, но python не считает их равными) - PullRequest
1 голос
/ 26 октября 2011

если вы вводите john, почему оператор if не запускается в ????

studentname.txt

john 34
paul 37
poop 45

выше - это то, что в studentname.txt

b=a
name = input('students name : ')
list1=[]

file=open('studentname.txt','r')
for (a) in file:
    list1.append(a)    
    b=a[:-3]    

почему это не так, если оператор отключается, если введенное имя, например, "john" ??

    if name == b:
        print(a)

file.close

Ответы [ 4 ]

1 голос
/ 26 октября 2011

Вы подбираете новые строки. В зависимости от операционной системы, в которой вы создали файл, у вас будут разные символы новой строки. Самый безопасный способ избавиться от этого:

a = a.rstrip()

Это позаботится о любых конечных пробелах.

Вы также можете сделать:

for a in map(lambda x: x.rstrip(), file):

Кроме того, не называйте вашу переменную «file». Это встроенная функция python, которую вы теперь переименовали для своего скрипта и любого скрипта, который его импортирует.

Наконец, вы можете предпочесть обрабатывать такие файлы:

with open("studentname.txt", 'r') as testfile:
    for item in (line.rstrip() for line in testfile):
        print item

Нет необходимости закрывать файл, оператор with контролирует его область действия и закрывает его.

0 голосов
/ 26 октября 2011

Ваша непосредственная проблема заключается в том, что другие уже упоминали, что вы не знаете \n в конце ваших данных. print и встроенная функция repr - ваши друзья; используйте их:

if name != b:
    print repr(name), repr(b)

, после чего причина проблемы становится очевидной.

Вот некоторый (непроверенный) код, который иллюстрирует лучшую практику при работе с простыми форматами файлов данных, такими как ваш. Он предназначен для работы с пустыми / пустыми строками, неопределенной последней строкой и реальными возможностями, такими как:

Jack 9
Jill 100
Billy Bob 99
Decimus 1.23
Numberless

без сбоя или запуска amok.

with open('studentname.txt','rU') as f:
    for line_number, line in enumerate(f, 1):
        line = line.rstrip('\n')
        fields = line.split()
        nf = len(fields]
        if nf == 0: 
            continue: # blank/empty line
        if nf == 1:
            print('Only 1 field in line', line_number, repr(line))
            continue
        dataname = ' '.join(fields[:-1])
        try:
            datanumber = int(fields[-1])
        except ValueError:
            print('Invalid number', repr(fields[-1]), 'in line',
                line_number, repr(line))
            continue
    list1.append((dataname, datanumber))   
    if name == dataname:
        print(repr(dataname), number)

Примечание file.close оценивает объект метода / функции, который ничего не делает. Вам нужно назвать это: file.close(). Однако теперь, когда вы используете оператор with, он будет выглядеть после закрытия файла, поэтому просто удалите эту строку file.close.

0 голосов
/ 26 октября 2011

Попробуйте это:

for a in file.readlines():
    name, _, score = a.strip().partition(' ')
    if name == b:
        print(a)

Это чище, поскольку оно не опирается на двузначное значение и более выразительно, чем произвольные индексы.Он также удаляет возврат каретки и новые строки.

0 голосов
/ 26 октября 2011

альтернативно, вы можете использовать a.strip()[:-3], который обрежет все пробельные символы перед тем, как взять подстроку.

...