2017-06-02 88 views
1

我已经使用getopts编写了一个脚本来接受四个用户输入项目(两个输入文件和两个输出文件)。但由于某些原因,我不断收到此错误:无法弄清楚是什么导致IOError来自

python2.7 compare_files.py -b /tmp/bigfile.txt -s /tmp/smallfile.txt -n /tmp/notinfile.txt -a /tmp/areinfile.txt 
compare_files.py -b <biggerfile> -s <smallerfile> -n <notinfile> -a <areinfile> d 
I/O error: [Errno 2] No such file or directory: '' 
(<type 'exceptions.IOError'>, IOError(2, 'No such file or directory'), <traceback object at 0x7f10c485c050>) 

我无法理解其中的输入项变量导致我的问题。请有人能告诉我我哪里出了问题? 这里的脚本:

import sys, getopt 

def main(argv): 
    binputfilename = '' 
    sinputfilename = '' 
    outputfilename1 = '' 
    outputfilename2 = '' 

    try: 
     opts, args = getopt.getopt(argv, "h:b:s:n:a", ["bfile=", "sfile=", "nfile=", "afile="]) 
    except getopt.GetoptError as (errno, strerror): 
     print(str(sys.argv[0]) + " -b <biggerfile> -s <smallerfile> -n <notinfile> -a <areinfile> a") 
     print("GetOpts error({0}): {1}".format(errno, strerror)) 
     sys.exit(2) 

    for opt, arg in opts: 
     if opt == '-h': 
      print(str(sys.argv[0]) + " -b <biggerfile> -s <smallerfile> -n <notinfile> -a <areinfile> b") 
      sys.exit() 
     elif opt in ("-b", "--bfile"): 
      binputfilename = arg 
     elif opt in ("-s", "--sfile"): 
      sinputfilename = arg 
     elif opt in ("-n", "--nfile"): 
      outputfilename1 = arg 
     elif opt in ("-a", "--afile"): 
      outputfilename2 = arg 
     elif len(sys.argv[1:]) > 4 or len(sys.argv[1:]) < 4: 
      print(str(sys.argv[0]) + " -b <biggerfile> -s <smallerfile> -n <notinfile> -a <areinfile> c") 
      sys.exit(2) 
    #smallset = set(open(sinputfilename).read().split()) 
    #bigset = set(open(binputfilename).read().split()) 

    with open(sinputfilename, 'r') as smallsetsrc, open(binputfilename, 'r') as bigsetsrc, open(outputfilename1, 'w') as outfile1, open(outputfilename2, 'w') as outfile2: 
     smallset = set(line.strip() for line in smallsetsrc) 
     bigset = set(line.strip() for line in bigsetsrc) 
     #find the elements in smallfile that arent in bigfile 
     outset1 = smallset.difference(bigset) 
     #find the elements in small file that ARE in bigfile 
     outset2 = smallset.intersection(bigset) 

     count = 0 
     for msisdn in outset1: 
      count += 1 
      #outfile1.write("%s, %s, %s, %s\n" % (str(count)+".", msisdn)) 
      print(str(count), msisdn) 
#  count = 0 
#  for msisdn in outset2: 
#   count += 1 
#   outfile2.write("%s, %s, %s, %s\n" % (str(count)+".", msisdn)) 

if __name__ == "__main__": 
    try: 
     main(sys.argv[1:]) 
    except IOError, e: 
     print(str(sys.argv[0]) + " -b <biggerfile> -s <smallerfile> -n <notinfile> -a <areinfile> d") 
     print("I/O error: {0}".format(str(e))) 
     print(sys.exc_info()) 
+1

简单,文件不存在提供的路径 –

+0

幸运的是,文件确实存在,我自己创建它们。 – Sina

+1

这些文件可能存在,但应该包含其名称的变量实际上并未设置。我会开始让它们不被初始化;当你尝试使用未设置的变量时,你会得到一个'NameError'。 – chepner

回答

2

下面是使用​​代替getopts,你的代码应该更好地确保正在指定正确的名称。 (通常,我不喜欢所需的选项;而是使用位置参数。)

请注意,您不需要同时打开文件;只要打开你需要的那个,只要你使用它。

from __future__ import print_function 
import argparse 

def main(): 
    p = argparse.ArgumentParser() 
    p.add_argument("-b", "--bfile", required=True) 
    p.add_argument("-s", "--sfile", required=True) 
    p.add_argument("-n", "--nfile", required=True) 
    p.add_argument("-a", "--afile" required=True) 
    args = p.parse_args() 

    with open(args.sfile) as smallsetsrc: 
     smallset = set(line.strip() for line in smallsetsrc) 

    with open(args.bfile) as bigsetsrc: 
     bigset = set(line.strip() for line in bigsetsrc) 

    outset1 = smallset.difference(bigset) 
    outset2 = smallset.intersection(bigset) 

    with open(args.nfile, "w") as out: 
     for count, msisdn in enumerate(outset1): 
      print("%d. %s" % (count, msisdn), file=out) 

    with open(args.afile, "w") as out: 
     for count, msisdn in enumerate(outset2): 
      print("%d. %s" % (count, msisdn), file=out) 


if __name__ == "__main__": 
    main() 
+0

这就像是超级快。到达之前,我几乎没有离开座位。谢谢! – Sina

相关问题