我使用 parser.argparser 类来解析脚本中的命令行参数。它很方便,因为它会自动检查作为命令参数传递的文件名的文件存在、权限等,并在出现问题时立即引发异常。它还可以处理“-”约定来打开标准输入/标准输出流。最终它返回一个随时可用的文件对象:
CommonArguments.add_argument('-o', '--output', type=argparse.FileType('wb'), required=True, help='Output file name')
print("Object type:", type(parser.parse_args().output))
-------
Object type: <class '_io.BufferedWriter'>
如果我想使用内置函数从文件中读取和写入,它效果很好。但是,由于我在 DataFrame 中处理数据,因此将对象传递给 DataFrame 方法来保存文件或从中读取文件会很方便。不幸的是, df.to_excel() 方法需要一个文件名并自行处理所有文件 IO,所以我最终使用:
df.to_excel(parser.parse_args().output.name, index=False)
是否有可能让两个库以更精简的方式协同工作?我实际上需要做的是从 DataFrame 中收集 excel 格式的数据并将其转储到 BufferedWriter 对象进行写入。我有点担心使用两个不同的对象访问同一文件。
输入也是如此:我想从 BufferedReader 收集数据(如果我传递“-”作为文件名,则可能是 STDIN),并从中创建一个数据帧,类似于:
df = pd.read_html(source_object)
不幸的是,我无法让 pd.read_html 从 stdin 读取。
有可能吗?
或者我错过了什么,有更好的解决方案吗?
FileType
是作为获取输入/输出文件的脚本的便捷工具而编写的。随着向 Py3 的过渡,它并没有很好地老化。
几年前,我为一个错误/问题编写了一个补丁,想要相当于一个
with context
,一个会自动关闭自身的文件对象。投入生产的工作量太大了。
我认为只接受一个文件名,然后用
open
或 pandas open
自己做会更好。
但如果您仍然想要错误检查的好处,自定义
type
函数可能是最佳选择。写起来应该不难。 –