Python 与输入文件相关的错误,ValueError:需要超过1个值才能解包

Python 与输入文件相关的错误,ValueError:需要超过1个值才能解包,python,Python,我正试图从我拥有的一本编码手册中运行以下代码,但出现以下错误: 回溯(最近一次呼叫最后一次): 文件“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 rewi

我正试图从我拥有的一本编码手册中运行以下代码,但出现以下错误:

回溯(最近一次呼叫最后一次): 文件“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)

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

此错误意味着
argv
没有“足够的值来解包”,即您试图通过调用
argv
变量从
argv
分配
script
input\u文件,但
argv
只有一个值(脚本名称)

您运行脚本时似乎没有提供参数(输入文件)。 应按以下方式运行脚本:

python ex20.py'path/to/input\u文件'
脚本,输入文件=argv
根据:

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

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

因为在左侧有两个变量(脚本和输入文件),列表还应该包含两个元素(根据错误文本,您的列表只包含一个元素,这意味着没有为脚本提供任何参数)

在幕后发生的事情

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

如果len(argv)!=2:
raise SystemExit(“脚本应该只接收一个参数!”)
当您从cmdline调用解释器(脚本)时,请确保也为输入文件传递一个值

@EDIT0

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

这段代码包含一堆无意义的部分(主要是因为混淆了当前的_文件和当前的_行,这表示命名错误)。我不打算坚持这样做,而是按照应该的样子粘贴代码:

导入系统 def打印全部(f): 打印(f.read()) def倒带(f): f、 搜索(0) def打印行(行号,f): 打印(行号,f.readline()) _,输入文件名称=sys.argv 输入文件=打开(输入文件名) 打印(“首先,让我们打印整个文件:\n”) 全部打印(输入文件) 打印(“现在让我们倒带,有点像磁带:\n”) 倒带(输入_文件) 当前线路=1 打印一行(当前行,输入文件) 当前_线+=1 打印一行(当前行,输入文件)

请注意,尽管您提到使用Python 2,但打印也可以在Python 3中使用。

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

如果您想让代码行正常工作,您应该确保
argv
长度正好为2,或者只需通过
argv
访问
argv
值,而无需赋值,但是,如果您确实想保持原样,我建议您先进行快速测试:

if len(argv) != 2:
    exit()
以及随后的其他代码。但您需要记住使用适当数量的args运行代码,如下所示:

python.py arg1

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


我想您应该如何使用像
argumentParser
之类的库。

输入文件是否作为命令行参数提供?请检查。您是如何运行脚本的?您向它传递了哪些参数?为什么要将脚本和输入文件设置为刚导入的包我的意思是argv返回一个列表,您需要定义您设置为什么。。。script,input_file=argv[0],argv[1]我假设脚本是代码本身,而input_文件是包含代码/.py脚本的同一文件中的文本文件。我通过终端aka“python ex20.py”运行它,我设置它是因为这本书告诉我要这么做。bash-4.3$python ex20.py input_file.txt首先让我们打印整个文件:Traceback(最后一次调用):文件“ex20.py”,第18行,在print_all(当前_文件)中NameError:name'current_file'未定义我使用的是python 2,这是我在尝试提供这两个参数时遇到的错误。我使用的是python 2,当我提供请求的2个参数时出现此错误:bash-4.3$python ex20.py input_file.txt首先让我们打印整个文件:回溯(最后一次调用):文件“ex20.py”,第18行,全部打印(当前文件)名称错误:名称“当前文件”不正确defined@Stalin这回答了你的问题吗。不是真的,但我正在读一本python2.7的书,并决定放弃它,因为3.xx是现代版本。当我可以学习3.xx时,学习2.7是没有用的,只要“反向学习”我可能需要修补的任何代码或将来可能出现的任何情况。请注意,你不必接受答案,除非它解决了你的问题。嗯,什么不起作用?让我知道,这样我可以修改(改进)答案。无论如何(我发布的代码),它应该可以在Python3和Python2上工作(因为它解决了问题中的问题和其他几个问题)。