如何停止 Python 2.7 RawConfigParser 在选项卡上抛出 ParsingError?

How to stop Python 2.7 RawConfigParser throwing ParsingError on tabs?

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

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

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

    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?

解决方法是使用 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)

因此解析器 "fooled" 通过读取文件内容减去制表符的假文件。