以艰难方式学习Python 第17练习
在模块的第4行解包时得到的值太多了。
script, from_file, to_file = argv line.
这是第17个练习的例子。
from sys import argv
from os.path import exists
script, from_file, to_file = argv
我知道我在做一些傻事。我使用的是Python 2.7.3版本。
这是我从练习中逐字复制粘贴的内容:
from sys import argv
from os.path import exist
script, from_file, to_file = argv
我尝试了两种解决方案,但都出现了无效的语法错误。
3 个回答
0
我的建议是,在处理命令行参数时一定要进行一些错误检查,比如说,至少做一些简单的检查:
from sys import argv,exit
if not len(argv)==3:
print "argv is" , argv
print "expected script fromfile tofile"
exit()
script, from_file, to_file = argv
另外,或者说用更符合Python风格的方式:
from sys import argv,exit
try:
script, from_file, to_file = argv
except:
print "argv is" , argv
print "expected script fromfile tofile"
exit()
注意从系统模块中导入exit这个功能。
1
在Python中,你可以像这样解包值:
my_packed_values = ('v1', 'v2', 'v3')
v1, v2, v3 = my_packed_values
print v1
print v2
print v3
这样你就能一次得到 v1
、v2
和 v3
这几个字符串。
所以你可以解包三个值。如果你写 v1, v2 = my_packed_values
,就会出现错误。
如果 argvs
中的值不够解包(右边的数量和左边的不匹配),你就会收到“解包的值太多”的错误。
这不是答案,但在我写这个的时候,@mbatchkarvo 已经指出了实际原因。
这里是 os.path.exists
,而不是 os.path.exist
。不过这不应该引发语法错误。
2
当你运行这个脚本的时候,需要提供两个命令行参数。假设这个脚本的名字是 test.py
,你需要这样运行它:
python test.py fromfile.txt tofile.txt
这样一来,你的变量 script
就会等于 "test.py",from_file
就会等于 "fromfile.txt",而 to_file
则会等于 "tofile.txt"。