根据用户的输入python打开文件

时间:2016-07-07 12:46:09

标签: python python-3.x

如何根据用户输入的整数从给定文件列表中打开文件

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:name' filename'未定义

4 个答案:

答案 0 :(得分:3)

您可以将文件列表存储为Python列表,如下所示:

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

然后打印它们,你会使用for循环:

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循环:

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

你仍然需要确保这个数字不是太大(或者说很小)。

答案 1 :(得分:1)

可能是因为您需要先将用户转换为int(可能是写入的字符串)。此外,如果用户输入非敏感值,您应该使用默认情况完成抛出错误...

答案 2 :(得分: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

答案 3 :(得分:0)

由于问题表明了学习编码的强烈意愿并且已经尝试了一些东西,我提供了一个适用于python版本3的变体(在版本2中,需要raw_input而不是输入,以及将来导入以声明print函数):

#! /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(dict提供快速查找)
  4. 从名称元组(忽略虚拟)
  5. 构建用户界面信息
  6. 将输入与验证分开
  7. 首先检查域类型(整数)。如果通过sys.exit提前退出并提供信息
  8. 检查域名成员资格,否则退出信息
  9. 打开上下文块中的资源文件名目标,这样您就不会忘记在完成处理时关闭