【问题标题】:Python Configparser. Whitespace causes AttributeErrorPython 配置解析器。空格导致 AttributeError
【发布时间】:2021-09-30 23:08:03
【问题描述】:

我收到了一些带有 .ini 文件的文件。我必须从 [FILES] 部分接收文件名。
有时 .ini 文件的另一部分中有一个额外的 witespace,这会在 ConfigParser 模块中引发异常
“坏”ini文件的例子:

[LETTER]
SUBJECT=some text
some text
 and text with whitespace in the beggining 

[FILES]
0=file1.txt
1=file2.doc

我的代码(Python 3.7):

import configparser

def get_files_from_ini_file(info_file):
    ini = configparser.ConfigParser(allow_no_value=True)
    ini.read(info_file) # ERROR is here
    if ini.has_section("FILES"):
        pocket_files = [ini.get("FILES", i) for i in ini.options("FILES")]
        return pocket_files

print(get_files_from_ini_file("D:\\bad.ini"))


Traceback (most recent call last):
  File "D:/test.py", line 10, in <module>
    print(get_files_from_ini_file("D:\\bad.ini"))
  File "D:/test.py", line 5, in get_files_from_ini_file
    ini.read(info_file) # ERROR
  File "C:\Users\ap\AppData\Local\Programs\Python\Python37-32\lib\configparser.py", line 696, in read
    self._read(fp, filename)
  File "C:\Users\ap\AppData\Local\Programs\Python\Python37-32\lib\configparser.py", line 1054, in _read
    cursect[optname].append(value)
AttributeError: 'NoneType' object has no attribute 'append'

我无法影响我收到的文件,所以有什么办法可以忽略这个错误?事实上,我只需要 [FILES] 部分来解析。
已尝试 empty_lines_in_values=False 没有结果
可能是无效的 ini 文件,我应该编写自己的解析器?

【问题讨论】:

  • 从来没有针对 INI 文件的规范。解释由用户决定。
  • 问题是SUBJECT后面的行不是以空格开头的;您可以预先解析文件并在这些实例中添加一个空格,但要决定何时需要一个空格并不容易 - 此时您最好自己获取所需的内容,因为配置是'开始无效。
  • @Grismar 明白了。谢谢

标签: python attributeerror configparser


【解决方案1】:

如果您只需要“文件”部分,一个简单的方法是:

  • 打开文件并读入字符串
  • 使用 .split() 方法获取“[FILES]”之后的部分
  • 在字符串前添加“[FILES]”
  • 对字符串使用configparser read_string方法

这是一个 hacky 解决方案,但它应该可以工作:

  import configparser

  def get_files_from_ini_file(info_file):
      with open(info_file, 'r') as file:
          ini_string = file.read()
      useful_part = "[FILES]" + ini_string.split("[FILES]")[-1]

      ini = configparser.ConfigParser(allow_no_value=True)
      ini.read_string(useful_part) # ERROR is here
      if ini.has_section("FILES"):
          pocket_files = [ini.get("FILES", i) for i in ini.options("FILES")]
          return pocket_files

  print(get_files_from_ini_file("D:\\bad.ini"))

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2012-07-15
  • 2017-01-15
  • 2017-06-12
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多