пытаясь получить вывод из файла, используя значение, введенное пользователем, затем распечатайте значение в python - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь выучить python, и я написал этот скрипт, который не показывает мне правильный результат .. Что мне не хватает?

У меня есть такой текстовый файл:

тест

test1

test2

test3

test4

# test5

test6

# test7

# test8

ЗАДАЧА 1:

  1. открыть файл : у меня есть эта часть
  2. * не печатать и игнорировать строки, начинающиеся с "#" : я думаю, что получил эту часть (fread2)

Вот мой код:

fopen=open('file1.txt',mode='r+')
fread=fopen.read()
fread2="\n".join([line.strip() for line in fread.splitlines() if not line.startswith('#')])

print(fread2)

fopen.close()

Вывод:

test

test1

test2

test3

test4

test6

Примечание : test5, 7 и 8 не печатались. Успешно!

ЗАДАЧА 2:

  1. попросить пользователя ввести текст : выполнено
  2. от fread2 output - используйте значение "input" пользователя, и если значение exit, то распечатайте только эту строку : failed !!

См. следующий код:

fopen=open('file1.txt',mode='r+')
fread=fopen.read()
fread2="\n".join([line.strip() for line in fread.splitlines() if not line.startswith('#')])
text=input("Enter text: ")
for x in fread2:
    if text == "":
        continue
    if text in x:
        print(x)
fopen.close()

Вывод

Введите текст: test

Где я ошибаюсь?

Ответы [ 2 ]

1 голос
/ 02 августа 2020

Ваш fread2 - это одна строка, поэтому, когда вы вызываете for x in fread2, вы повторяете каждую букву, а не каждую строку файла. Вы можете увидеть это, выполнив:

for x in fread2:
    print(x)

Вы должны сохранить все строки в списке или выполнить итерацию по строкам файла.

ПРИМЕР

Попробуйте следовать этому коду:

fopen=open('file1.txt',mode='r+')
fread=fopen.read()

fread2=[]

for line in fread.splitlines():
    if not line.startswith('#'):
        fread2.append(line) #this is important! 
                            #If you write "+=" you'll iterate on every single letter

text=input("Enter text: ")
for x in fread2:
    if text in x:
        print("I've found "+x)
fopen.close()

Если пользователь напишет «2», ваш результат будет:

output example


UPDATE

As requested in the comments, If you want to check if the user input equals a file line you have to replace

if text in x:

with

if text==x:

So, if the user write "text", the lines "text2", "text3" etc. will be not printed!

Here is an output example:

вывод 2 пример

0 голосов
/ 02 августа 2020

Как упоминалось в комментариях, переменная fread2 представляет собой одну большую строку, содержащую все строки. Когда вы перебираете строку, вы перебираете ее символы . Итак, пример итерации вашего l oop:

if "test" in "e":
    print(x)

Легко видеть, что это не то, к чему вы стремились.

Чтобы решить эту проблему, вы можете выполнить итерацию через строк, выполнив:

for x in fread2.split("\n"):

Но лично я думаю, что более элегантным решением было бы сначала сохранить строки в списке и изменить только способ их печати:

with open('file1.txt',mode='r+') as fopen:
    fread = [line.strip() for line in fopen if not line.startswith('#')]

# first assignment
print(*fread, sep='\n')

#second assignment
text = input("Enter text: ")
for line in fread:
    if text == line:
        print(line)

Обратите внимание, что я использовал with, чтобы открыть файл, что является идиоматическим c способом сделать это.

...