先說一下在讀取配置文件時報錯的問題--ConfigParser.MissingSectionHeaderError: File contains no section headerspython
問題描述:windows
在練習ConfigParser讀取配置文件時,cmd一直報一個錯:ConfigParser.MissingSectionHeaderError: File contains no section headers.如圖:編輯器
D:\test_python>python task_test.py
Traceback (most recent call last):
File "task_test.py", line 20, in <module>
pp=ParsePageObjectRepositoryConfig()
File "task_test.py", line 9, in __init__
self.cf.read("D:\\test_python\\dataDriven\\conf\\PageObjectRepository.ini")
File "C:\Python27\lib\ConfigParser.py", line 305, in read
self._read(fp, filename)
File "C:\Python27\lib\ConfigParser.py", line 512, in _read
raise MissingSectionHeaderError(fpname, lineno, line)
ConfigParser.MissingSectionHeaderError: File contains no section headers.
file: D:\test_python\dataDriven\conf\PageObjectRepository.ini, line: 1
'\xef\xbb\xbf#\xe6\xaf\x8f\xe4\xb8\xaa\xe9\xa1\xb5\xe9\x9d\xa2\xe7\x94\xa8\xe4\xb8\x80\xe4\xb8\xaasection\xe6\xa0\x87\xe8\xaf\x86\n'函數
百度了一下網上的解決方案,編碼
報錯是由於配置文件PageObjectRepository.ini在windows下通過notepad編輯後保存爲UTF-8或者unicode格式的話,會在文件的開頭加上兩個字節「\xff\xfe」或者三個字節「\xef\xbb\xbf」。 就是--》BOM, BOM是什麼?請看結尾
spa
解決的辦法就是在配置文件被讀取前,把DOM字節個去掉。3d
網上也給了一個用正則去掉BOM字節的函數:就是把對應的字節替換成空字符串code
remove_BOM()函數定義:blog
def remove_BOM(config_path):
content = open(config_path).read()
content = re.sub(r"\xfe\xff","", content)
content = re.sub(r"\xff\xfe","", content)
content = re.sub(r"\xef\xbb\xbf","", content)
open(config_path, 'w').write(content)utf-8
下面貼一下個人配置文件和讀取配置文件的代碼--:
代碼:
#encoding=utf-8
from ConfigParser import ConfigParser
import re
def remove_BOM(config_path):#去掉配置文件開頭的BOM字節
content = open(config_path).read()
content = re.sub(r"\xfe\xff","", content)
content = re.sub(r"\xff\xfe","", content)
content = re.sub(r"\xef\xbb\xbf","", content)
open(config_path, 'w').write(content)
class ParsePageObjectRepositoryConfig(object):
def __init__(self,config_path):
self.cf=ConfigParser()#生成解析器
self.cf.read(config_path)
print "-"*80
print "cf.read(config_path):\n", self.cf.read(config_path)
def getItemsFromSection(self,sectionName):
print self.cf.items(sectionName)
return dict(self.cf.items(sectionName))
def getOptionValue(self,sectionName,optionName):#返回一個字典
return self.cf.get(sectionName,optionName)
if __name__=='__main__':
remove_BOM("D:\\test_python\\PageObjectRepository.ini")
pp=ParsePageObjectRepositoryConfig("D:\\test_python\\PageObjectRepository.ini")
remove_BOM
print "-"*80
print "items of '126mail_login':\n",pp.getItemsFromSection("126mail_login")
print "-"*80
print "value of 'login_page.username' under section '126mail_login':\n",pp.getOptionValue("126mail_login","login_page.username")
結果:
D:\test_python>python task_test.py
--------------------------------------------------------------------------------
cf.read(config_path):
['D:\\test_python\\PageObjectRepository.ini']
--------------------------------------------------------------------------------
items of '126mail_login':
[('login_page.frame', 'id>x-URS-iframe'), ('login_page.username', "xpath>//input[@name='email']"), ('login_page.password', "xpath>//input[@name='password']"), ('login_page.loginbutton', 'id>dologin')]
{'login_page.loginbutton': 'id>dologin', 'login_page.username': "xpath>//input[@name='email']", 'login_page.frame': 'id>x-URS-iframe', 'login_page.password': "xpath>//input[@name='password']"}
--------------------------------------------------------------------------------
value of 'login_page.username' under section '126mail_login':
xpath>//input[@name='email']
BOM概念:
BOM(Byte Order Mark),字節順序標記,出如今文本文件頭部,Unicode編碼標準中用於標識文件是採用哪一種格式的編碼。
UTF-8 不須要 BOM 來代表字節順序,但能夠用 BOM 來代表編碼方式。字符 「Zero Width No-Break Space」 的 UTF-8 編碼是 EF BB BF。因此若是接收者收到以 EF BB BF 開頭的字節流,就知道這是 UTF-8編碼了。Windows 就是使用 BOM 來標記文本文件的編碼方式的。相似WINDOWS自帶的記事本等軟件,在保存一個以UTF-8編碼的文件時,會在文件開始的地方插入三個不可見的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隱藏的字符,用於讓記事本等編輯器識別這個文件是否以UTF-8編碼。
從堆棧信息中能夠看到UTF8編碼的字符有BOM的字符串前邊有:\xef\xbb\xbf
'\xef\xbb\xbf#\xe6\xaf\x8f\xe4\xb8\xaa\xe9\xa1\xb5\xe9\x9d\xa2\xe7\x94\xa8\xe4\xb8\x80\xe4\xb8\xaasection\xe6\xa0\x87\xe8\xaf\x86\n'