c语言怎么取消BOM文件头,python ConfigParser读取配置文件,及解决报错(去掉BOM)ConfigParser.MissingSectionHeaderError: File con...

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

问题描述:

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

42f1b4da39b9b2b9e8ca646d2e4fd260.png

D:\test_python>python task_test.py

Traceback (most recent call last):

File "task_test.py", line 20, in

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是什么?请看结尾

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

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

remove_BOM()函数定义:

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)

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

d76b1c38c2310b6b46fd7ca0c1ce5748.png

代码:

#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'

ConfigParser.MissingSectionHeaderError: File contains no section headers.

今天使用ConfigParser解析一个ini文件,报出如下错误: config.read(logFile) File "C:\Python26\lib\ConfigParser.py&qu ...

python在读取配置文件存入列表中,去掉回车符号

self.receiver = map(lambda x: x.strip(), receiver_list) # 去掉list中的回车符号

ConfigParser读取配置文件时报错:ConfigParser.MissingSectionHeaderError

使用ConfigParser来读取配置文件,经常会发现经过记事本.notepad++修改后的配置文件读取时出现下面的问题: ConfigParser.MissingSectionHeaderError ...

python之读取配置文件模块configparser(二)参数详解

configparser.ConfigParser参数详解 从configparser的__ini__中可以看到有如下参数: def __init__(self, defaults=None, dic ...

python中读取配置文件ConfigParser

在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单的做一些介 ...

DB2读取CLOB字段-was报错:操作无效:已关闭 Lob。 ERRORCODE=-4470, SQLSTATE=null

DB2读取CLOB字段-was报错:操作无效:已关闭 Lob. ERRORCODE=-4470, SQLSTATE=null 解决方法,在WAS中要用的数据源里面配置连个定制属性: progressi ...

(转)coures包下载和安装 可解决报错ImportError: No module named '_curses'

原创文章,转载请注明出处. coures curses 库 ( ncurses )提供了控制字符屏幕的独立于终端的方法.curses 是大多数类似于 UNIX 的系统(包括Linux)的标准部分,而且 ...

随机推荐

L1-009. N个数求和

https://www.patest.cn/contests/gplt/L1-009 原来写的找了好久还是有一个测试点没过, 虽说是道水题,但是今天一遍就过了还是挺高兴的. 送你机组数据 52/5 4 ...

Intellij IDEA 快捷键整理(TonyCody)

[常规] Ctrl+Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更 ...

Write Your software base on plugin(C/C++ ABI)

一个软件,如果把所有的功能写进C++源码,维护,扩展,编译都特别麻烦. 共享库后缀名.Linux -> .so  Windows -> .dll 关于动态符号显示问题,具体可以看系统的AP ...

1、c#对XML文件的解析

1.XML文件 <?xml version="1.0" encoding="utf-8"?>

Windows下caffe的python接口配置

主要是因为,发现很多代码是用python编写的,在这里使用的python安装包是anaconda2. 对应下载地址为: https://www.continuum.io/downloads/ 安装py ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值