【问题标题】:Python argparse input file errorPython argparse 输入文件错误
【发布时间】:2015-11-11 16:53:53
【问题描述】:

我见过类似的问题,但不是适用于这种情况的解决方案。我有一个 argparser 函数:

def IO_fileParse():
     parser = argparse.ArgumentParser();
     parser.add_argument("-i", dest="input_file", help="no file with this name") 
     args = parser.parse_args();

     input_file = os.path.join(os.getcwd(),args.input_file)
     if not os.path.exists(input_file):
         print(" ------------------------------------------------");
         print("Error: -input_file Cannot find input file with that name.");
         print(" ------------------------------------------------");
         parser.print_help();
         sys.exit();

我想说“如果在目录中找不到带有 -i 名称的文件,请打印帮助并退出脚本。”

实际发生的情况是,这似乎用输入文件的名称创建了一个空文件?

如何将上述代码更改为“如果 -i 文件不存在,则告诉用户此文件不存在”(并且不要使用不存在的文件名创建空文件)。

我也尝试过 os.path.isfile 和 os.path.exists,也没有给我想要的错误?...如果不是 args.input_file 我也尝试过

【问题讨论】:

  • if not args.input_file 因为它是可选的?
  • 我也试过 os.path.isfile 和 os.path.exists,也没有给我想要的错误?...如果不是 args.input_file 我也试过.
  • 您有任何关于文件的电话到open() 吗?我在代码中看不到任何会生成文件的内容.. 并确保在测试之前删除文件(以防不明显:))

标签: python argparse


【解决方案1】:
  1. 取出分号。他们为什么在那里?
  2. 您没有正确访问该变量。

  3. 您将它存储在一个名为 -i 的变量中。尝试调用它-input_file,去掉,dest,通过args.input_file访问

  4. os.getcwd(),会给你工作目录,而不是当前路径。获取当前路径os.path.dirname(os.path.abspath("__file__"))

  5. 我不知道你说得对不对,但按照我提议的结构,用法应该是python test.py -input_file filename

编辑:您可以通过parser.add_argument("-i", "--input_name")提供速记选项和完整形式

此代码适用于我

def IO_fileParse():
    parser = argparse.ArgumentParser()
    parser.add_argument("-input_file", help="no file with this name")
    args = parser.parse_args()

    input_file = os.path.join(os.getcwd(),args.input_file)
    print(input_file)
    if not os.path.exists(input_file):
        print(" ------------------------------------------------")
        print("Error: -input_file Cannot find input file with that name.")
        print(" ------------------------------------------------")
        parser.print_help()
        sys.exit()

IO_fileParse()

【讨论】:

  • 通常,'-i' 是短标志形式,'--input_file'(或'--input-file')是长标志形式。 (一个短划线,两个长划线)。 dest 是从第一个 long 推导出来的,但也可以显式给出。
  • 谢谢你的建议,我完全复制到我的代码中,现在它可以工作了。
【解决方案2】:

除了细微的调整外,我认为您的脚本没有问题。这是我的测试:

In [52]: p=argparse.ArgumentParser()    
In [53]: p.add_argument('-i','--input-file')
...

没有标记选项,默认为None,路径连接不起作用。应该给它一个有效的默认值或使用if args.input_file is not None: 测试。

In [54]: args=p.parse_args(''.split())    
In [55]: args
Out[55]: Namespace(input_file=None)

In [56]: name=os.path.join(os.getcwd(),args.input_file)
...
AttributeError: 'NoneType' object has no attribute 'startswith'

使用现有文件名:

In [57]: args=p.parse_args('-i test'.split())
In [58]: args
Out[58]: Namespace(input_file='test')
In [59]: name=os.path.join(os.getcwd(),args.input_file)
In [60]: name
Out[60]: '/home/paul/test'   # valid file name
In [61]: os.path.exists(name)
Out[61]: True    # it exists on my system

随机选择一个名字

In [62]: args=p.parse_args('-i random'.split())
In [63]: name=os.path.join(os.getcwd(),args.input_file)
In [65]: os.path.exists(name)
Out[65]: False    # it doesn't exist

重复exists 测试表明没有任何内容创建文件。

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2014-06-03
    • 1970-01-01
    • 2014-03-02
    • 2013-06-06
    • 2017-08-20
    相关资源
    最近更新 更多