2016-07-07 2 views
-1

Как открыть файл из списка заданных файлов на основе пользовательского ввода, который представляет собой целое числоОткрытие файла на основе ввода питона пользователя

print("Enter 1.tp.txt\n2.c17testpat.pat\n3.c432testpat.pat\n4.c499testpat.pat\n5.c1335testpat.pat\n6.c6228testpat.pat") 
user = input("Enter a number") 
if user == 1: 
    filename = "tp.txt" 
elif user == 2: 
    filename = "c17testpat.pat" 
elif user == 3: 
    filename = "c432testpat" 
elif user == 4: 
    filename = "c499testpat.pat" 
elif user == 5: 
    filename = "c1355testpat.pat" 
elif user == 6: 
    filename = "c6288testpat.pat" 

fp = open(filename) 

есть ли другой способ сделать это в Python

это вызвало NameError: имя «имя файла» не определен

+3

Используй словарь. – linusg

+1

То, что вы прочитали, является строкой, и оно не будет равно ни одному из того, с чем вы сравниваете его, поэтому переменная 'filename' не будет существовать.Преобразуйте его в int и выведите некоторое сообщение об ошибке, если вы не получите действительный ввод. –

+0

http://stackoverflow.com/questions/11479816/what-is-the-python-equivalent-for-a-case-switch-statement может помочь – Deca

ответ

1

вероятно потому, что вам нужно преобразовать пользователя int первой (может быть строкой, как написано). Кроме того, вы, вероятно, следует закончить с делом по умолчанию, чтобы выдавать ошибку, если пользователь вводит значение нон ... бы бессмысленно

+0

Да, я забыл вводить ввод консольного ввода, и я работал без дефолта –

+1

Он будет работать без случая по умолчанию, если пользователь всегда вводит имя файла, которого вы ожидаете, но вы не можете доверять этому пользователю. :) –

3

Вы можете сохранить список файлов в виде списка Python, например, так:

files = ["filename_1", "filename_2", "filename_3"] 

Тогда печатать их, вы бы использовать цикл:

for i, s in enumerate(files): # Use enumerate because we need to know which element it was 
    print(str(i + 1) + ": "+ s) # i + 1 because lists start from 0 

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

while True: 
    inp = input() 
    if inp.isdigit(): 
     filename = files[int(inp) - 1] # - 1 because lists start from 0 
     break 
    else: 
     print("Enter a number") 

Вам все равно нужно убедиться, что число не слишком большое (или небольшое, если на то пошло).

0

Не python, но стоит знать, как использовать его через bash. Простой образец bash, который отображает содержимое папки и позволяет пользователю выбрать файл по индексу.

# menu.sh 
# usage: bash menu.sh FOLDER 

select FILENAME in $1/*; 
do 
    case $FILENAME in 
     "$QUIT") 
      echo "Exiting." 
      break 
      ;; 
     *) 
      echo "You picked $FILENAME ($REPLY)" 
      chmod go-rwx "$FILENAME" 
      ;; 
    esac 
done 

Кредит http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_06.html

0

Поскольку вопрос указывает на сильную волю, чтобы узнать кодирования и уже пытался что-то, я предлагаю вариант, который работает на питона версии 3 (в версии 2 можно было бы необходимо raw_input вместо ввода и будущий импорт, чтобы объявить функцию печати):

#! /usr/bin/env python3 

import sys 


names_known = ( # Hints 1 and 2 
    None, "tp.txt", "c17testpat.pat", "c432test.pat", 
    "c499testpat.pat", "c1355testpat.pat", "c6288testpat.pat") 
options_map = dict(zip(range(len(names_known)), names_known)) # 3 

print("Enter:") 
for choice, name in enumerate(names_known[1:], start=1): # 4 
    print('%d.%s' % (choice, name)) 

user_choice = input("Enter a number") # 5 

try: # 6 
    entry_index = int(user_choice) 
except: 
    sys.exit("No integer given!") 

if not entry_index or entry_index not in options_map: # 7 
    sys.exit("No filename matching %d" % (entry_index,)) 

with open(options_map[entry_index]) as f: # 8 
    # do something with f 
    pass 

Многое еще может пойти не так, и любая ошибка будет необходимо пользователю перезапустить (не в то время как петли и т.д.), но некоторые достижения

  1. ли имена хранятся только один раз (здесь я выбрал кортеж)
  2. Держи 1 в качестве первого номера в пользовательском интерфейсе (вставить манекен с индексом 0)
  3. выведут Dict из кортежа, хранящих имена (ДИКТ предлагает быстрый поиск)
  4. построить информацию пользовательского интерфейса от имени кортежа (не обращая внимание на манекен)
  5. Отдельный вход от проверки
  6. типа Проверка домена первого (целое число). Если не удается выйти рано через sys.exit и отправить информацию
  7. членства Проверки домена в противном случае выход с информацией
  8. открыть цели имени файла ресурсов в контексте блоке, так что вы не забыли закрыть, когда сделано с обработкой
Смежные вопросы