Как распечатать всю строку из файла, используя пользовательский ввод - PullRequest
1 голос
/ 03 августа 2020

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

файл выглядит так:

1.1.1.0     test
1.1.1.1     test1
1.1.1.2     test2
1.1.1.3     test3
1.1.1.4     test4
1.1.1.5     test5
1.1.1.6     test6
1.1.1.7     test7
1.1.1.8     test8

ПРОБЛЕМА 1:

В операторе if внутри for l oop, если я использую in, он напечатает строку, когда входное значение равно, например: "test4" - этот вывод правильный:

Enter text here: test4
1.1.1.4     test4

Однако, если ввод равен test, он напечатает все значения, в которых есть "test":

fopen = open('sample.txt',mode='r+')
fread = fopen.readlines()

ui = input("Enter text here: ")

for line in fread:
    if ui in line:
        print(line)

fopen.close()

ВЫХОД:

Enter text here: test
1.1.1.0     test

1.1.1.1     test1

1.1.1.2     test2

1.1.1.3     test3

1.1.1.4     test4

1.1.1.5     test5

1.1.1.6     test6

1.1.1.7     test7

1.1.1.8     test8

Как я могу решить эту проблему?

ПРОБЛЕМА 2:

В операторе if внутри для l oop, если я использую ==, он не будет печатать ничего ... grrr!

fopen = open('sample.txt',mode='r+')
fread = fopen.readlines()
    
ui = input("Enter text here: ")

for line in fread:
    if ui == line:
        print(line)
                                               
fopen.close()

OUTPUT:

Enter text here: test

Что я делаю не так?

Ответы [ 5 ]

2 голосов
/ 03 августа 2020

Просто создайте список слов в этой строке, а затем проверьте, есть ли ввод в этом списке:

with open('sample.txt', mode='r+') as fopen:
    for line in fopen:
        if ui in line.split():
            print(line)

Волшебным образом это решит обе ваши проблемы, если вводится test, например, вы не будете печатать строки с test4.

Уловка использует str.split():

>>> line = "1.1.1 test3"
>>> splt = line.split()
>>> splt
['1.1.1', 'test3']
>>> "test" in splt
False
>>> "test3" in splt
True
1 голос
/ 03 августа 2020

вы можете использовать функцию endwith ()

for line in fread:
    if line.endswith(f"{ui}\n"):
        print(line)

результат будет примерно таким:

➜  ~ python3 script.py 
Enter text here: test
1.1.1.0     test

➜  ~ python3 script.py
Enter text here: test3
1.1.1.3     test3

➜  ~ python3 script.py
Enter text here: test2
1.1.1.2     test2
0 голосов
/ 03 августа 2020

Я думаю, вы хотите сохранить строки, последнее слово которых именно то, что вводит пользователь.

Попробуйте следующее:

ui=input("Enter text here: ")
with open('sample.txt',mode='r+') as stream:
    for line in stream:  # Yes looping over a text file yields lines
        words = line.split()  # "xx  yy  zz ".split() -> ["xx", "yy", "zz"]
        if words[-1] == ui:  # Compare with last word
            print(line)

# You don't need to close the file, you used it in a context mgr ("with ...")
0 голосов
/ 03 августа 2020

Вы забыли проверить каждое слово в строке, а вместо этого проверяли, был ли ключ в строке вообще как подстрока. Вам нужно убедиться, что вы разбили строку (строку), а затем проверьте каждый элемент, чтобы убедиться, что ваш ключ соответствует элементу. Тогда использование ключевого слова in будет делать то, что вы ожидаете, поскольку вы сравниваете 2 объекта, чтобы проверить, равны ли их значения. Это будет то же самое, что выполнить для l oop в разделенном списке, а затем использовать ==, чтобы проверить, совпадают ли key и i.

fopen = open('sample.txt',mode='r+')
fread = fopen.readlines()

ui=input("Enter text here: ")

for line in fread:
    if ui in line.split():
        print(line)

fopen.close()
0 голосов
/ 03 августа 2020

Вы можете разделить пробелы и выполнить операцию ==, чтобы проверить ввод пользователя.

fopen = open('tmp.txt',mode='r+')
fread = fopen.readlines()

ui=input("Enter text here: ")

for line in fread:
    # split on whitespace
    value, key = line.split()
    if ui == key:
        print(line)
fopen.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...