【问题标题】:how to read a txt passed by command line argument如何读取通过命令行参数传递的 txt
【发布时间】:2019-09-09 17:56:34
【问题描述】:

我想使用 argparse 模块通过命令行参数传递一个 txt 文件,并使用 open() 函数读取文件,但我遇到的第一件事是这个错误:

AttributeError: 'dict' object has no attribute 's'

这是我的代码

import argparse
parser = argparse.ArgumentParser(description="My program!", formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("-s", type=argparse.FileType('r'), help="Filename/path to be passed")
args = vars(parser.parse_args())
subfile = (open(args.s, "r")).read()

【问题讨论】:

  • subfile = (open(args['s'], "r")).read() ?如果argsdict,则不能像从对象args 调用方法s 那样做args.s。如果要获取字典中键的值,请改用语法dict[key]
  • @MrFuppes 感谢您的帮助,但它给了我一个类型错误:TypeError: expected str, bytes or os.PathLike object, not NoneType
  • 似乎您在没有指定文件名的情况下调用了脚本(参数 -s)。添加了一个答案来澄清。
  • 你为什么用args = vars(parser.parse_args())而不是args = parser.parse_args()
  • @wjandrea:我想如果不打电话给vars()args.s 本来就可以工作

标签: python


【解决方案1】:

您可以直接从args['s'] 读取,因为type=argparse.FileType('r')。不需要open()

import argparse
parser = argparse.ArgumentParser(description="My program!", formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("-s", type=argparse.FileType('r'), help="Filename/path to be passed")
args = vars(parser.parse_args())
data = args['s'].readlines()
print(data)

现在您可以从命令提示符调用脚本,例如如python .\test.py -s'D:/test.txt' 和 test.txt 包含两行字母'abc':

# prints ['abc\n', 'abc\n']

编辑 - 您可以将代码简化为

parser = argparse.ArgumentParser(description="My program!", formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("-f", type=argparse.FileType('r', encoding='UTF-8'), help="path/filename of file to be passed")
data = parser.parse_args().f.readlines()

变化:

  • 将参数名称更改为f,我发现它更适合 文件名输入
  • 添加和编码到type=argparse.FileType('r') - 否则,它将采用操作系统默认值(例如在 Windows 上:cp1252)。 ID 认为明确指定编码是更好的做法。
  • parser.parse_args().f直接访问io.TextIOWrapper 而不是首先使用 vars() 创建一个 dict 对象

【讨论】:

  • 请注意,为什么当我将参数更改为 -w 并将 args 更改为 args["w"] 时会引发关键错误
  • 您是否也将 parser.add_argument("-s" ... 更改为 parser.add_argument("-w" ...?顺便说一句。我会使用更直观的东西,例如 -f,作为文件路径参数。
  • 好的,我会把它改成 -f 最重要的是它不会抛出这个关键错误
  • @toxicpr0xy:您可以通过调用parser.parse_args().f 直接访问已解析的f 参数——无需使用vars()。进行了编辑以澄清。这绝对避免了KeyError ;-) 相反,如果您尝试调用未指定的参数,您将得到AttributeError,例如此处例如c in parser.parse_args().c -> 给出AttributeError: 'Namespace' object has no attribute 'c'
  • 这里的规则不允许说谢谢,但我不能在这么多帮助下保持沉默,所以非常感谢这是我的第一个脚本^^
【解决方案2】:

替换最后一行:

subfile = (open(args.s, "r")).read()

与:

with open( args['s'] ) as fin :
    subfile = fin.read()

事情神奇地开始工作,你没有一个打开的文件,没有什么特别的原因。

【讨论】:

  • 为什么当我将参数更改为 -w 并将 args 更改为 args["w"] 时,它会抛出:key error:"w"
猜你喜欢
  • 2015-07-20
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2017-04-14
  • 2017-09-11
相关资源
最近更新 更多