2016-11-14 83 views
-1

我想构建一个python脚本,用户可以通过文件名从命令行但由于某种原因文件名不被识别提供错误,当它的时间为csv循环阅读文件。如果我静态地放置文件的名字,这个脚本没有问题。任何帮助是极大的赞赏。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

“提供错误”像什么? – TigerhawkT3

+0

@ TigerhawkT3 - 我更新了错误,我看到的问题 – yusof

+0

@ TigerhawkT3 - 之前我没有(csvfile,'r'),我从(csvfile) – yusof

回答

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定义do,每个但没有参数
  • b:定义b,期望的参数
  • ff重新定义,但没有参数

文件名开关f而不论点定义。

您可以用"n:l:d:f:?"替换"?fn:ln:dob:f",其中n,l,d和f分别是名称(名),姓,文件名和文件名。

# 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) 

这应该给下面的输出:

通过把一个print(opts); print(args)只是getopt直插后想在这个test.py检查结果

[email protected]$ 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']) 

[email protected]$ 
+0

我继续前进,纠正了你提到的表达式,并且我还为opts和args做了一个打印,这就是我得到的结果[('-f','')] ['list.csv'] – yusof

+0

如果我使用script.py -n john -l来调用脚本,opts和args的打印是[('-n','john'),('-l','doe')] [] – yusof

+0

描述不正确,答案会更新。 – maij