从 stdin < 检查文件是否存在

Checking if a file exists from stdin <

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

./script.py < somefilename

如您所见,文件名可能没有任何扩展名。这应该也适用于多个平台,最好。

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

这提出了两个我无法真正解决的问题:

  1. 我想确保文件的文件类型正确(即可以保存文本)
  2. 检查文件确实存在。

在我目前的形式中,我使用 argparse 来解析标志,但由于要求已经改变,我需要使用更多 dynamic(他们说),解决方案,我实现 < "piper"。使用 stdin.

非常简单

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

'No such file or directory'


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

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

我也试过使用 fileinput,但我无法使用 fileinput.filename(),直到我已经读取文件:

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

有人对我如何在上述示例 (./script.py < somefilename) 上添加一些可靠的文件验证有任何建议吗?

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

我建议返回 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
如果该名称下的文件存在,

将 return 它的参数,否则它将测试可能的扩展名和 return 第一个匹配项,或者 return None 如果不存在找到匹配项。

您的程序无法确定 shell 是如何调用它的,因此从您的程序的角度来看,这两个命令没有区别:

$ ./script.py < somefilename

$ cat somefilename | script.py

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

如果您要实现的目标是验证程序的参数,您始终可以提供一种额外的方法,方法是使用 -i 切换:./script.py -i somefilename,并验证文件 somefilename 是否存在。为了达到所需的多功能性水平,该程序还可以提供一个选项,可以在没有 -i 开关的情况下调用,假设应该从 stdin.

读取文件