Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于用户打开文件';s输入python_Python_Python 3.x - Fatal编程技术网

基于用户打开文件';s输入python

基于用户打开文件';s输入python,python,python-3.x,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 = "c17te

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

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中还有其他方法吗


这导致名称错误:未定义名称“filename”

可能是因为您需要先将用户转换为
int
(可能是写入的字符串)。另外,如果用户输入了非敏感值,您可能应该使用默认情况结束,以引发错误…

您可以将文件列表存储为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")

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

不是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

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

许多事情仍然可能出错,任何错误都需要用户重新启动(无while循环等),但也有一些成就

  • 名称只存储一次(这里我选择了一个元组)
  • 将1保留为用户界面中的第一个数字(在索引0处插入虚拟值)
  • 从存储名称的元组派生dict(dict提供快速查找)
  • 从名称元组构建用户界面信息(忽略虚拟)
  • 将输入与验证分开
  • 首先检查域类型(整数)。如果失败,请通过sys.exit提前退出并提供信息
  • 检查域成员资格,否则退出信息
  • 在上下文块中打开资源文件名目标,以便在完成处理时不会忘记关闭

  • 您所读取的是一个字符串,它将不等于您将其与之进行比较的任何内容,因此变量
    filename
    将不存在。如果没有收到有效的输入,请将其转换为int并输出一些错误消息。可能会有帮助是的,我忘记键入cast控制台输入,我在没有默认大小写的情况下工作。如果用户总是输入您期望的文件名,则它将在没有默认大小写的情况下工作,但您不能相信用户会这样做。:)
    #! /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