【问题标题】:Reading file from command line argument error从命令行参数错误读取文件
【发布时间】:2020-12-24 17:56:08
【问题描述】:

我正在编写一个程序(从命令行参数读取文件)和一些要处理的异常。我有 2 个例外:1)如果我要读取的文件在路径中不存在,我应该给出一个例外。2)如果我要读取的文件的格式不匹配,我应该给出另一个例外。

try:
    f = open(sys.argv[2], 'r')
    commands = [[line.split()] for line in f.readlines()]
    f.close()
except FileNotFoundError:
    print('Input file not found')
    sys.exit()
    

对于第一个例外,我做到了,但我不能做第二个,我该怎么办?

注意:第二个异常意味着如果我在命令行中写了 x.txt 并且如果 x.pptx 存在,我应该给出一个异常,例如“格式不正确”。

【问题讨论】:

  • 你确定要[line.split()]吗? split 已经返回一个列表;你可能只想要[line.split() for line in f]。 (致电readlines绝对没有必要。)

标签: python python-3.x exception


【解决方案1】:
import os.path
from os import path
path.exists("somefile.txt")

所以,这会检查 somefile.txt 是否在同一目录中。 (它将返回 True 或 False)。 如果不是,你可以直接打印“格式不正确”而不是报错

import os.path
from os import path


try:
    f = open(sys.argv[2], 'r')
    commands = [[line.split()] for line in f.readlines()]
    f.close()
   
    exitsOrNot = path.exists("somefile.txt")
    if exitsOrNot == False:
        print("Format not correct") 
except FileNotFoundError:
    print('Input file not found')
    sys.exit()
    

【讨论】:

    【解决方案2】:

    你可以定义一个custom exception:

    class MyException(Exception):
        pass
    

    如果文件格式检查的条件失败则引发它:

    try:
        f = open(sys.argv[2], 'r')
        commands = [[line.split()] for line in f.readlines()]
        if incorrect_format(sys.argv[2]):
            f.close()
            raise MyException
        f.close()
    except FileNotFoundError:
        print('Input file not found')
        sys.exit()
    except MyException:
        print('File format not correct')
        sys.exit()
    

    您可以在函数incorrect_format 中定义文件格式检查的逻辑。示例:

    def incorrect_format(filename):
        return filename.split(".")[-1] == "txt"
    

    【讨论】: