如何在Python 2.7 RawConfigParser上停止抛出ParsingError的标签?

时间:2017-07-31 12:14:04

标签: python git python-2.7 tabs python-3.3

我正在编写与Python 2.7.13Python 3.3兼容的软件包,并使用以下内容:

try:
    import configparser
except:
    from six.moves import configparser

但是当我在.gitmodules上加载Python 2.7文件时:

    configParser   = configparser.RawConfigParser( allow_no_value=True )
    configFilePath = os.path.join( current_directory, '.gitmodules' )

    configParser.read( configFilePath )

抛出错误:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "update.py", line 122, in run
    self.create_backstroke_pulls()
  File "update.py", line 132, in create_backstroke_pulls
    configParser.read( configFilePath )
  File "/usr/lib/python2.7/ConfigParser.py", line 305, in read
    self._read(fp, filename)
  File "/usr/lib/python2.7/ConfigParser.py", line 546, in _read
    raise e
ParsingError: File contains parsing errors: /cygdrive/d/.gitmodules
        [line  2]: '\tpath = .versioning\n'
        [line  3]: '\turl = https://github.com/user/repo\n'

但是如果我从.gitmodules文件中删除标签,它就能正常工作。在Python 3.3上它可以使用标签,仅在Python 2.7.13上使用标签。如何在不删除标签的情况下使其工作?

当我添加新的子模块时,git本地放置了标签,所以我绝对不会将它们从原始文件中删除。我一直在想我可以复制文件,同时删除标签。但与Python兼容的操作成本是否较低?

相关问题:

  1. How can I remove the white characters from configuration file?

1 个答案:

答案 0 :(得分:2)

解决方法是使用带有修改内容的io.StringIO传递给readfp(它接受文件句柄而不是文件名)。

以下代码试图遵循Python 2和Python 3(即使在python 3中,readfp已被弃用,现在它是read_file。无论如何它仍然有效。请注意,我不需要six个包,configparser本身存在于2& 3个python版本。

try:
    import ConfigParser as configparser
except ImportError:
    import configparser

import io
try:
    unicode
except NameError:
    unicode = str  # python 3: no more unicode

r = configparser.RawConfigParser()

with open(configFilePath) as f:
    fakefile = io.StringIO(unicode(f.read().replace("\t","")))

r.readfp(fakefile,filename=configFilePath)

因此,通过使用filecontents减去标签来读取伪文件,“解析”了解析器。