Как искать в текстовом файле из пользовательского ввода, чем распечатать его с помощью Python? - PullRequest
2 голосов
/ 05 ноября 2019

У меня проблемы с чтением нескольких строк в текстовом файле с использованием Python. Моя проблема заключается в том, чтобы взять пользовательский ввод, найти этот фрагмент текста и распечатать его несколькими строками после него. Я пытаюсь сохранить это в функции while, используя elif для продолжения этой части. Этот код должен взять введенный пользователем штат США и распечатать его после капитолия этого штата и штата. Это делается путем чтения в текстовом файле, содержащем информацию обо всех 50 штатах. Это код, с которым я сейчас работаю. Это небольшая часть меню, над которым я работаю.

 elif x == "2":
    f = open("States and Capitals.txt", "r")
    x = input("Enter the state you would like to search: ") 
    searchlines = f.read()
    for x, line in enumerate(searchlines):
        if x in line:
            for l in searchlines[i:i+3]: print l,
        print(x)
    f.close()

Пример текстового файла:

Алабама

Столица: Монтгомери

Государственная птица: Йеллохаммер

Государственный цветок: Камелия

Аляска

Столица: Джуно

Государственная птица: Ива куропатка

Государственный цветок:Не забудь меня

Аризона

Столица: Феникс

Государственная птица: Кактус Рен

Государственный цветок: Сагуаро Кактус в цвету

Ответы [ 4 ]

1 голос
/ 05 ноября 2019

Вы можете использовать этот код

f = open("States and Capitals.txt", "r")
x = input("enter value to search : ") 
searchlines = f.read()
if(searchlines.find(x)):
    print(x)
f.close()
0 голосов
/ 06 ноября 2019

Вот способ прочитать файл тремя строками за раз и распечатать данные из найденного состояния, которое соответствует (если есть):

from itertools import zip_longest

# See https://docs.python.org/3/library/itertools.html#itertools-recipes
def grouper(iterable, n, fillvalue=None):
    ''' Collect data into fixed-length chunks or blocks. '''
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)


target_state = input('Please enter a state name: ')

with open('States and Capitals.txt', 'r') as file:
    for group in grouper(file, 3, ''):  # Read file three lines at a time.
        state, capital, bird = map(str.rstrip, group)  # Remove newlines.
        if state == target_state:
            print(f'State: {state}, Bird: {bird}')
            break  # All done.
    else:
        print(f'Error: No state found named {target_state}')

Пример вывода:

State: Kansas, Bird: Western Meadowlark
0 голосов
/ 06 ноября 2019

Попробуй это. Сначала вы можете разделить ввод файла в список с помощью функции split(), которая в этом случае использует "\n" или newline в качестве разделителя. Затем вы просто печатаете следующие 3 строки из индекса или найденной строки (если она существует). Здесь я предполагаю, что вы хотите напечатать состояние, столицу, птицу и цветок (всего 4 строки).

elif x == "2":
    f = open("States and Capitals.txt", "r")
    x = input("Enter the state you would like to search: ") 
    searchlines = f.read().split("\n")
    if x in searchlines:
        index = searchlines.index(x)
        for i in range(4):
            print(searchlines[index+i])
    f.close()

Если вы хотите исключить State из выходных данных, потому что это возможно избыточно, тогда вы можете сделать следующие незначительные изменения:

elif x == "2":
    f = open("States and Capitals.txt", "r")
    x = input("Enter the state you would like to search: ") 
    searchlines = f.read().split("\n")
    if x in searchlines:
        index = searchlines.index(x)
        for i in range(1,4):
            print(searchlines[index+i])
    f.close()
0 голосов
/ 05 ноября 2019

Я думаю, что-то подобное может работать. В результате вы получите переменную, в которой есть строка, которую вы хотите. Затем вы можете распечатать это.

elif x == "2":
    state= input("\nPlease enter a State.\n")
    with open("States and Capitals.txt", "r") as f:
        for line in f:
            if state.lower() in line.lower(): output=line
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...