繁体   English   中英

Python2 移植到 Python3:ConfigParser 异常 - MissingSectionHeaderError 上的 AttributeError

[英]Python2 porting to Python3: ConfigParser Exceptions - AttributeError on MissingSectionHeaderError

我正在尝试将 Python2.7 脚本移植到 Python3.6+ 并且遇到了我的谷歌搜索无法解决的障碍。 问题是,在做了一些初始移植建议之后,下面的 try: except: call 似乎不起作用。 我敢肯定这很简单; 只是此刻逃脱了我。

Python2.7代码:(工作)

import ConfigParser
logOutCfg = ConfigParser.ConfigParser()

try:
 if (os.path.isfile(logOutfilename)) : logOutCfg.read(logOutfilename)
except ConfigParser.MissingSectionHeaderError as e:
 pass
except ConfigParser.ParsingError as e:
 print(str(e))
 pass

Python3.6尝试的代码(在 Python 2.7 下不起作用):

from configparser import ConfigParser
logOutCfg = ConfigParser()

try:
 if (os.path.isfile(logOutfilename)) : logOutCfg.read(logOutfilename)
except ConfigParser.MissingSectionHeaderError as e:
 pass
except ConfigParser.ParsingError as e:
 print(str(e))
 pass

脚本在Python2下运行报错为:

 File "<script>.py", line 242, in <function>
    except ConfigParser.MissingSectionHeaderError:
AttributeError: type object 'ConfigParser' has no attribute 'MissingSectionHeaderError'

我很确定我尝试了很多不同的东西。 包括: except configparser.MissingSectionHeaderError但没有喜悦。

我错过了什么? 在可预见的未来……至少在接下来的 9 个月内,我需要代码在 Python2 和 Python3 中工作。

@mkrieger1 是对的。 关键是还要导入 configparser

import configparser
from configparser import ConfigParser

logOutCfg = ConfigParser()

try:
 if (os.path.isfile(logOutfilename)) : logOutCfg.read(logOutfilename)
except configparser.MissingSectionHeaderError as e:
 pass
except configparser.ParsingError as e:
 print(str(e))
 pass

您的 Python 3.6 代码大部分是正确的。 唯一的问题是您试图从ConfigParser class 而不是configparser模块中获取异常。 这里的主要混淆很可能来自于模块名称在 Python 3 中更改为更符合PEP8 标准的事实。 最初, ConfigParser模块和 class 共享相同的名称,但在 Python 3 中并非如此。

下面的代码应该在 Python 2 和 3 中工作。

try:
    import configparser
except ImportError: 
    import ConfigParser as configparser

logOutCfg = configparser.ConfigParser()

try:
    if (os.path.isfile(logOutfilename)):
        logOutCfg.read(logOutfilename)
except configparser.MissingSectionHeaderError as e:
    pass
except configparser.ParsingError as e:
    print(e)

这是这里发生的事情的快速细分。

try:
    import configparser
except ImportError: 
    import ConfigParser as configparser

尝试导入 Python 3 configparser模块。 如果在 Python 2 中,这将引发ImportError 我们抓住了这一点,而是导入ConfigParser并使用configparser为其别名。

logOutCfg = configparser.ConfigParser()

从上面导入的configparser模块中ConfigParser class,并将其实例化。

try:
    if (os.path.isfile(logOutfilename)):
        logOutCfg.read(logOutfilename)
except configparser.MissingSectionHeaderError as e:
    pass
except configparser.ParsingError as e:
    print(e)

尝试像以前一样打开文件,但不要尝试从ConfigParser class 获取异常,而是从configparser模块获取它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM