python ConfigParser读取配置文件,及解决报错(去掉BOM)ConfigParser.MissingSectionHeaderError: File contains no section headers的方法

摘要:
即--˃BOM,什么是BOM?解决方案是在读取配置文件之前删除DOM字节。

先说一下在读取配置文件时报错的问题--ConfigParser.MissingSectionHeaderError: File contains no section headers

问题描述:

在练习ConfigParser读取配置文件时,cmd一直报一个错:ConfigParser.MissingSectionHeaderError: File contains no section headers.如图:

python ConfigParser读取配置文件,及解决报错(去掉BOM)ConfigParser.MissingSectionHeaderError: File contains no section headers的方法第1张

D: est_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:Python27libConfigParser.py", line 305, in read
    self._read(fp, filename)
  File "C:Python27libConfigParser.py", line 512, in _read
    raise MissingSectionHeaderError(fpname, lineno, line)
ConfigParser.MissingSectionHeaderError: File contains no section headers.
file: D: est_pythondataDrivenconfPageObjectRepository.ini, line: 1
'xefxbbxbf#xe6xafx8fxe4xb8xaaxe9xa1xb5xe9x9dxa2xe7x94xa8xe4xb8x80xe4xb8xaasectionxe6xa0x87xe8xafx86 '

百度了一下网上的解决方案,

报错是因为配置文件PageObjectRepository.ini在windows下经过notepad编辑后保存为UTF-8或者unicode格式的话,会在文件的开头加上两个字节“xffxfe”或者三个字节“xefxbbxbf”。 就是--》BOM, BOM是什么?请看结尾

解决的办法就是在配置文件被读取前,把DOM字节个去掉。

网上也给了一个用正则去掉BOM字节的函数:就是把对应的字节替换成空字符串

remove_BOM()函数定义:

def remove_BOM(config_path):
    content = open(config_path).read()
    content = re.sub(r"xfexff","", content)
    content = re.sub(r"xffxfe","", content)
    content = re.sub(r"xefxbbxbf","", content)
    open(config_path, 'w').write(content)

下面贴一下我的配置文件和读取配置文件的代码--:

python ConfigParser读取配置文件,及解决报错(去掉BOM)ConfigParser.MissingSectionHeaderError: File contains no section headers的方法第2张

代码:

#encoding=utf-8
from ConfigParser import ConfigParser
import re

def remove_BOM(config_path):#去掉配置文件开头的BOM字节
    content = open(config_path).read()
    content = re.sub(r"xfexff","", content)
    content = re.sub(r"xffxfe","", content)
    content = re.sub(r"xefxbbxbf","", 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): ", 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': ",pp.getItemsFromSection("126mail_login")
    print "-"*80
    print "value of 'login_page.username' under section '126mail_login': ",pp.getOptionValue("126mail_login","login_page.username")

结果:

D: est_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的字符串前边有:xefxbbxbf

'xefxbbxbf#xe6xafx8fxe4xb8xaaxe9xa1xb5xe9x9dxa2xe7x94xa8xe4xb8x80xe4xb8xaasectionxe6xa0x87xe8xafx86 '

免责声明:文章转载自《python ConfigParser读取配置文件,及解决报错(去掉BOM)ConfigParser.MissingSectionHeaderError: File contains no section headers的方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇波场TRX 钱包开发,看这篇就够了在ie和chrome浏览器中滚动条样式的设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

maven之BOM及BOM和provided的一个小坑

  BOM(Bill of Materials)定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。      子模块很多时,可以使用dependencyManagement在父模块中统一管理。   父模块中配置:...

关于AD10如何输出自己想要的BOM表

新年新开始,过完年来上班,脑子里面的东西很多又忘光了,索性写下来做个备忘录,今天为了输出一个自己想要的BOM表,结果发现去年会弄的,但是现在尴尬的又忘了怎么弄了,结果又是网上一波资料,废了好久时间,最后终于输出自己想要的了,废话不多说,直接上图: 一、首先选中Reports→Bill of Materials   二、然后将value值拖入上方的框中,...

Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题

在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。   这个标识在Java读取文件的时候,不会被去掉,而且String.trim()也无法删除。如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个B...

刨根究底字符编码之十六——Windows记事本的诡异怪事:微软为什么跟联通有仇?(没有BOM,所以被误判为UTF8。“联通”两个汉字的GB内码,其第一第二个字节的起始部分分别是“110”和“10”,,第三第四个字节也分别是“110”和“10”)

1. 当用一个软件(比如Windows记事本或Notepad++)打开一个文本文件时,它要做的第一件事是确定这个文本文件究竟是使用哪种编码方式保存的,以便于该软件对其正确解码,否则将显示为乱码。 一般软件确定文本文件编码方式的方法有如下三种: 检测文件头标识; 提示用户手动选择; 根据一定的规则自行推断。 2. 文件头标识一般指的是字节顺序标记BOM(...

BOM的介绍

BOM的概念 BOM(Browser Object Model) 是指浏览器对象模型。 浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。 BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。 我们在浏览器中的一些操作都可以使用BOM的方式进行编程处理, 比如:刷新浏览器、后退、前进...

vim字符串替换及小技巧

vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。   :s/vivian/sky/替换当前行第一个 vivian 为 sky   :s/vivian/sky/g 替换当前行所有 vivian 为 sky   :n,$s/vi...