Python 配置分析器。空格导致 AttributeError
Python Configparser. Whitespace causes AttributeError
我收到了一些带有 .ini 文件的文件。我必须从 [FILES] 部分接收文件名。
有时在 .ini 文件的另一部分中有一个额外的空格,这会在 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 文件,我应该编写自己的解析器吗?
如果您只需要“FILES”部分,一个简单的方法是:
- 打开文件并读入字符串
- 使用 .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"))
我收到了一些带有 .ini 文件的文件。我必须从 [FILES] 部分接收文件名。
有时在 .ini 文件的另一部分中有一个额外的空格,这会在 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 文件,我应该编写自己的解析器吗?
如果您只需要“FILES”部分,一个简单的方法是:
- 打开文件并读入字符串
- 使用 .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"))