我正在尝试构建一个python脚本,用户可以从命令行传递文件名,但由于某种原因,当csv循环读取文件时,文件名未被识别,从而提供错误。如果我静态地放置文件的名称,脚本可以正常工作。非常感谢任何帮助。
#!/usr/bin/python
import sys, getopt, re, csv
def pushname(firstname, lastname, dob):
print firstname + '\n'
print lastname + '\n'
print dob + '\n'
def printUsage():
print 'script.py -f <inputfile>'
def main(argv):
firstname = ''; lastname = ''; dob = ''; csvfile = ''
try:
opts, args = getopt.getopt(argv,"?fn:ln:dob:f",["fistname",
"lastname", "dob", "csvfile="])`
except getopt.GetoptError:
printUsage()
sys.exit(2)
if len(opts) == 0:
printUsage()
sys.exit(0)
for opt, arg in opts:
if opt in ("-f", "--file"):
csvfile = arg
elif opt in ("-fn"):
firstname = arg
elif opt in ("-ln"):
lastname = arg
elif opt in ("-dob"):
dob = arg
print csvfile
with open(csvfile, 'r') as file:
reader = csv.DictReader(file)
for row in reader:
firstname = row['firstname']
lastname = row['lastname']
dob = row['dob']
pushname(firstname, lastname, dob)
if __name__ == "__main__":
main(sys.argv[1:])
我看到的错误是:
Traceback (most recent call last):
File "script.py", line 37, in <module>
main(sys.argv[1:])
File "script.py", line 46, in main
with open(csvfile, 'r') as file:
IOError: [Errno 22] invalid mode ('r') or filename: ''
答案 0 :(得分:0)
第opts, args = getopt.getopt(argv,"?fn:ln:dob:f",["fistname", "lastname", "dob", "csvfile="])
行是错误的。特别是"?fn:ln:dob:f"
。此表达式指定必须仅包含一个唯一字母的短选项。字母后跟冒号指定期望参数的选项。您执行以下操作:
?f
定义选项?
,f
,不带参数n:
定义选项n
,期待参数l
定义l
,不带参数n:
重新定义n
,期待参数do
定义d
,o
,每个都没有参数b:
定义b
,期待参数f
重新定义f
,不带参数文件名开关f
的定义没有参数。
您可以将"?fn:ln:dob:f"
替换为"n:l:d:f:?"
,其中n,l,d和f分别是名称(名字),姓氏,dob和文件名。
检查您的结果,在print(opts); print(args)
- 行之后放置一个getopt
,就像在这个test.py中一样:
# test.py
import sys
import getopt
opts, args = getopt.getopt(sys.argv[1:], "?fn:ln:dob:f", ["fistname", "lastname", "dob", "csvfile="])
print("before: ", opts, args)
opts, args = getopt.getopt(sys.argv[1:], "n:l:d:f:?", ["firstname", "lastname", "dob", "filename"])
print("after: ", opts, args)
这应该给出以下输出:
maij@host$ python test.py -f 1 -l 2 -d 3 -n 4 -? 5
('before: ', [('-f', '')], ['1', '-l', '2', '-d', '3', '-n', '4', '-?', '5'])
('after: ', [('-f', '1'), ('-l', '2'), ('-d', '3'), ('-n', '4'), ('-?', '')], ['5'])
maij@host$