Как принять пользовательский ввод несколько раз, а затем выполнить остальную часть сценария, когда они будут сделаны?
Я хочу написать скрипт, в котором пользователь может получить список всех файлов в каталоге, а затем ввести полное имя файла, чтобы просмотреть их. Прямо сейчас мой сценарий позволит пользователю сделать это один раз, а затем он перейдет к следующей части сценария. Я хотел бы, чтобы он оставался в этой части, чтобы они могли продолжать вводить имена файлов и проходить столько файлов, сколько захотят. Затем я хочу сказать что-то вроде "Нажмите Enter, чтобы продолжить...", и затем он перейдет к следующей части сценария. Я думаю, что это будет своего рода цикл, но я очень плохо знаком с Python. Я надеюсь, что все имеет смысл.
Вот что у меня так далеко.
for root, dirs., files in os.walk("/home/user/Documents"):
for file in files:
print(os.path.join(root, file))
fname = raw_input('Enter filename to view:')
f = open(fname, 'r')
print f.read()
Поэтому я хочу, чтобы это повторялось, когда пользователь каждый раз вводит другое имя файла, и когда пользователь решит это сделать, он может перейти к следующей части моего сценария. Прямо сейчас это проходит только один раз, прежде чем идти дальше. Заранее спасибо за помощь!
3 ответа
Как указывает Падрайк в своем комментарии, while
оператор, вероятно, является лучшим соответствием для этой программы потока. Может быть так:
import os
def does_user_want_to_continue():
# implement this, so it returns True or False,
# depending on what your user wants.
# Probably involves asking the user and accepting their input.
should_continue = True
while should_continue:
for root, dirs, files in os.walk("/home/user/Documents"):
for file in files:
print(os.path.join(root, file))
fname = raw_input('Enter filename to view:')
f = open(fname, 'r')
print f.read()
should_continue = does_user_want_to_continue()
Вы также можете выйти из цикла изнутри, вместо того, чтобы изменить то, что его условие-выражение оценивает:
import os
while True:
for root, dirs, files in os.walk("/home/user/Documents"):
for file in files:
print(os.path.join(root, file))
fname = raw_input('Enter filename to view '
'(leave empty to proceed without viewing another file):')
if not fname: # Empty strings are 'falsy'.
break
# The rest of the while clause will only be executed
# if above we didn't break out of the loop. If we did
# break out, the script continues with the code after
# this loop.
f = open(fname, 'r')
print f.read()
В основном это то же самое, что ответил das-g, но с возможностью фактически спросить, хотите ли вы продолжить, я уверен, что это должно удовлетворить ваши потребности:
def yorn():
while True:
answer=raw_input('yes or no: ')
if answer == 'no':
more_script()
break
else:
for root, dirs., files in os.walk("/home/user/Documents"):
for file in files:
print(os.path.join(root, file))
fname = raw_input('Enter filename to view:')
f = open(fname, 'r')
print f.read()
def more_script():
print "were you would add the next portion"
yorn()
Кстати, это напечатано прямо сейчас, что никогда не произойдет.
Вам нужно предложить опцию "побег" для вашего пользователя, иначе он отправит файлы на свое усмотрение. (Вы можете попробовать экранировать условие, например: если пользователь вводит 0, вы переходите к следующей части, в которой будет напечатано "Нажмите Enter, чтобы продолжить..")
Так что псевдокодирование немного будет выглядеть так:
initialize a list
store directory files in list
while input != escape character
ask user for file name
if file name inside list:
print file
print "Press Enter to Continue"
else:
print error
print "Press Enter to Continue"
Надеюсь, что это дает вам общее представление.