2016-11-14 339 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