【问题标题】:Error related to input file, ValueError: need more than 1 value to unpack与输入文件相关的错误,ValueError: need more than 1 value to unpack
【发布时间】:2019-10-18 20:49:45
【问题描述】:

我正在尝试从我拥有的编码书中运行以下代码,但出现此错误:

Traceback(最近一次调用最后一次): 文件“ex20.py”,第 3 行,在 脚本,输入文件 = argv ValueError: 需要超过 1 个值才能解压

我创建了一个名为 input_file 的 txt 文件并尝试了其他故障排除方法,但我仍然遇到错误。

from sys import argv

script, input_file = argv

def print_all(f):
        print f.read()

def rewind(f):
    f.seek(0)

def print_a_line(line_count, f):
    print line_count, f.readline()

current_line = open(input_file)

print "First let's print the whole file:\n"

print_all(current_file)

print("Now lets rewind, kind of like a tape")

current_line = 1
print_a_line(current_line, current_line)

current_line = current_line + 1
print_a_line(current_line, current_file)

我希望它能按编码打印和工作。

【问题讨论】:

  • input_file 是否作为命令行参数提供?请检查。
  • 你是如何运行脚本的?你向它传递了什么论据?
  • 你为什么要把脚本和input_file设置成你刚导入的包? - 我的意思是 argv 返回一个列表,您需要定义您设置的内容... script, input_file = argv[0], argv[1]
  • 我假设脚本是它自己的代码,而 input_file 是一个文本文件,位于具有 code/.py 脚本的同一文件中。我正在通过终端运行它,也就是“python ex20.py”,我正在设置它,因为这就是这本书告诉我要做的。
  • bash-4.3$ python ex20.py input_file.txt 首先让我们打印整个文件: Traceback(最近一次调用最后一次):文件“ex20.py”,第 18 行,在 print_all( current_file) NameError: name 'current_file' is not defined 我使用的是 python 2,这是我在尝试提供两个参数时遇到的错误。

标签: python


【解决方案1】:

这个错误意味着argv没有“足够的值来解压”,即你试图通过destructuring分配argv变量中的scriptinput_file,但是@987654326 @ 只有一个值(脚本的名称)

您似乎在没有提供参数(input_file)的情况下运行了您的脚本。 您应该按以下方式运行脚本:

python ex20.py 'path/to/input_file'

【讨论】:

    【解决方案2】:
    script, input_file = argv
    

    根据[Python 3.Docs]: sys.argv

    传递给 Python 脚本的命令行参数列表。

    因此,无论是否将参数传递给脚本(或者是否将脚本传递给解释器),它始终是一个列表(序列)。

    由于左侧有 2 个变量(scriptinput_file),列表也应该包含 2 个元素(根据错误text yours 仅包含一个 - 表示脚本未提供任何参数)。

    在幕后,[Python 3.Docs]: More Control Flow Tools - Unpacking Argument Lists 发生了。

    处理这种情况的常用方法是检查列表中有多少元素:

    if len(argv) != 2:
        raise SystemExit("Script should receive exactly one argument!")
    

    当您从 cmdline 调用解释器(您的脚本)时,请确保也为您的输入文件传递一个值。

    @EDIT0

    从技术上讲,这超出了(原始)问题范围

    代码包含一堆无意义的部分(主要是因为混淆了 current_filecurrent_line - 这表示命名错误)。我不会坚持它们,而是将代码粘贴为应该的样子:

    import sys
    
    
    def print_all(f):
        print(f.read())
    
    
    def rewind(f):
        f.seek(0)
    
    
    def print_a_line(line_number, f):
        print(line_number, f.readline())
    
    
    _, input_file_name = sys.argv
    
    input_file = open(input_file_name)
    
    print("First, let's print the whole file:\n")
    print_all(input_file)
    print("Now lets rewind, kind of like a tape:\n")
    rewind(input_file)
    current_line = 1
    print_a_line(current_line, input_file)
    current_line += 1
    print_a_line(current_line, input_file)
    

    请注意,虽然您提到使用 Python 2,但 prints 也可以在 Python 3 中使用。

    【讨论】:

    • 我正在使用 python2,当我提供请求的 2 个参数时出现此错误: bash-4.3$ python ex20.py input_file.txt 首先让我们打印整个文件: Traceback(最近一次调用最后一次) :文件“ex20.py”,第 18 行,在 print_all(current_file) NameError: name 'current_file' is not defined
    • @Stalin:这回答了你的问题吗? [SO]: What should I do when someone answers my question?.
    • 不是真的,但我正在阅读一本 python2.7 的书并决定放弃它,因为 3.xx 是现代版本。当我可以学习 3.xx 并且只是“反向学习”我可能需要修补的任何代码或将来可能发生的任何情况时,学习 2.7 是没有用的。
    • 请注意,除非它解决了您的问题,否则您不必接受答案。嗯,什么没用?让我知道,以便我可以修改(改进)答案。无论如何(我发布的代码)它应该适用于 Python 3 和 2(因为它解决了问题中的问题和其他几个问题)。
    【解决方案3】:

    当您有“超过 1 个要解包的值”时,就会出现问题,这意味着 argv 小于您要分配的变量数。

    如果您希望您的代码行正常工作,您应该确保您的 argv 长度正好为 2,或者只需通过 argv 访问 argv 值而不进行分配,但是,如果您确实想保留它正如我建议之前的快速测试一样:

    if len(argv) != 2:
        exit()
    

    以及之后的其余代码。但您需要记住使用适当数量的 args 运行代码,如下所示:

    python <your_script_file>.py arg1

    以这种方式将arg1 替换为您要分配给input_file 的值,因为argv[0] 始终是您正在运行的脚本/文件的名称。

    恕我直言,您应该使用 argumentParser 之类的库或类似的东西。

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      相关资源
      最近更新 更多