【问题标题】:Detecting for invalid file inputs, Python检测无效的文件输入,Python
【发布时间】:2015-12-13 18:01:10
【问题描述】:

我有一个任务是编写一个“检测文件是否可读”的 Python 脚本。

我不知道应该运行哪些异常。假设输入文件是一个文本文件,扩展名为*.txt

我应该提出什么异常?我怀疑应该有多个。目前,我有:

with open('example_file.txt") as textfile:
        if not textfile.lower().endswith('.txt'):
            raise argparse.ArgumentTypeError(
                'Not a text file! Argument filename must be of type *.txt')
        return textfile

但是,这只检查文件扩展名。我还能检查什么? Python中文件I/O的标准是什么?

【问题讨论】:

  • 可读性是什么意思?这是否意味着该文件存在?这是否意味着该文件仅包含可打印字符(例如 ascii 字符)?这是否意味着您具有从文件中读取的适当权限?
  • 另外,扩展不会影响python读取文件的能力。
  • 为什么 csv 文件必须具有 .csv 扩展名?
  • 我认为你需要弄清楚你的任务是什么。我在第一条评论中提到了一些你可以做的不同的事情。
  • @PadraicCunningham 我认为这意味着“该程序仅在文本文件上运行”。如果用户输入 .pdf 或 .ppt,则引发错误。这合理吗?

标签: python input raiserror


【解决方案1】:

检查文件是否存在

import os.path
if os.path.exists('example_file.txt'):
    print('it exists!')

除此之外,成功opening 文件将证明可读性。如果失败,内置的open 会引发IOError 异常。失败的原因可能不止一个,所以我们必须检查它是否由于可读性而失败:

import errno
try:
    textfile = open('example_file.txt', 'r')
    textfile.close()
    print("file is readable")
except IOError as e:
    if e.errno == errno.EACCES:
        print("file exists, but isn't readable")
    elif e.errno == errno.ENOENT:
        print("files isn't readable because it isn't there")

relevant section of the docs on file permissions. 请注意,不鼓励在调用open 之前使用os.access 来检查可读性。

【讨论】:

  • @PadraicCunningham 如果我可以在“r”模式下打开文件,这意味着它是可读的。权限检查在您打开文件时完成。 (这显然并不意味着文件的内容是有效的或可以被我的程序解释。)
  • @SebastianRiese,是的,这是一个要求,文件必须是文本文件,你是说打开文件就意味着它是?
  • os.R_OK 只是测试读取权限,您可以并且应该在尝试使用if e.errno == errno.EACCES 进行检查时捕获这些权限。 docs.python.org/2/library/os.html#files-and-directories
  • @PadraicCunningham 感谢您的澄清。现在看起来准确吗?
  • 是的,第一个受竞争条件的影响,但可能与 OP 无关,也可能是 except IOError as e 所以它适用于 2 和 3
猜你喜欢
  • 1970-01-01
  • 2019-09-26
  • 2014-12-01
  • 2016-03-27
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 2012-05-30
相关资源
最近更新 更多