Python读取CSV并发送到函数

时间:2016-11-14 00:12:33

标签: 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: ''

1 个答案:

答案 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定义do,每个都没有参数
  • 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$