检查stdin中是否存在文件<

时间:2017-06-05 11:41:41

标签: python python-3.x file stdin

我正在尝试在Python脚本上创建验证,该脚本应从命令行获取文件。很像:

./script.py < somefilename

正如您所看到的,文件名可能没有任何类型的扩展名。这也应该适用于多个平台,最好是。

在验证方面,它应该能够保存由换行符\n分隔的字符串行。

这带来了两个我无法解决的问题:

  1. 我想确保文件的文件类型正确(即可以保存文本)
  2. 检查文件是否确实存在。
  3. 在我目前的表单中,我使用argparse来解析标志,但由于需求已经改变,我需要使用更多的动态(他们说),我实现<的解决方案风笛手”。使用stdin

    非常简单

    但是使用stdin会产生问题,因为我无法验证该文件是否存在;如果没有正确的扩展名,用户可能会输入textfile,这会显示

      

    '没有这样的文件或目录'

    我想要做的是创建可以保留文本(例如“.txt”)的可能扩展名列表,并检查是否存在具有该扩展名的文件,以防输入的文件不存在不存在于当前文件夹中。只是为了让它更强大...

    使用stdin时,这似乎非常困难(如果不是不可能),因为您无法在多个平台上正确连接文件名。

    我也尝试过使用fileinput,但在我读完文件之前我不能使用fileinput.filename()

    for line in fileinput.input():
        print fileinput.filename()
    

    有没有人对如何在上述示例(./script.py < somefilename)上添加强大的文件验证有任何建议?

    甚至可以在多个平台上使用?

2 个答案:

答案 0 :(得分:2)

我建议回到argparse并检查是否存在输入文件。这个功能:

import os
def check_file(filename):
    possible_extensions = ('', '.txt', '.dat')
    for e in possible_extensions:
        if os.path.isfile(filename + e): 
            return filename + e
    else:
        return None
如果存在该名称下的文件,

将返回其参数,否则它将测试可能的扩展并返回第一个匹配,如果未找到匹配则返回None

答案 1 :(得分:2)

您的程序无法确定shell如何调用它,因此这两个命令与您的程序的观点无法区分:

$ ./script.py < somefilename

$ cat somefilename | script.py

如果文件somefilename不存在,则调用者将收到类似No such file or directory的shell错误,并且./script.py甚至不会被shell调用,所以原则上它没有机会验证任何东西。

如果您尝试实现的目标是验证程序的参数,则可以通过使用{{将输入文件传递给它来始终为此提供其他方式1}}切换:-i,并验证文件./script.py -i somefilename是否存在。为了达到理想的多功能性,程序还可以提供一个不带somefilename开关的选项,假设应该从-i读取文件。