引入configparser,直接read整个INI文件,再调用get即可。但需要注意的是,如果INI文件本身不太规范,就会报各种错,而这又常常不可避免的。本文自定义函数通过try...except..来自动纠正再重读。

此外,注册表导出文件大概齐就是INI文件格式,但取初一行的声明也会被认定为没有SECTION头而报错。本文也进行了自动纠正。

极大概率是早有人造过更好的轮子,我写在这里权当作自己学习Python的笔记。功能、特色如下:

  1. getINIValue函数三个参数,iniFile, section, option应该不用特别说明;
  2. 若iniFile本身不存在或未知异常,返回None,同时输出报错信息;
  3. INI文件编码自动尝试,目前顺序为gb2312 utf-8 utf-16 gbk gb18030;
  4. INI文件内容不规范(section或option重复异常即configparser.DuplicateSectionError, configparser.DuplicateOptionError)自动纠正(注释后面的,以前面的为准);
  5. 注册表导出Reg文件不符合INI规范(缺少SECTION头异常即configparser.MissingSectionHeaderError)自动纠正(注释最初行);
  6. 找不到Option(考虑到一种情况:上位指定.reg的Option时没加",自动追加);
  7. 自动纠正INI文件时产生的备份文件自动删除。

Python源码如下,欢迎讨论指正....

 import configparser
import os bakpostfix = '.ibk' ## [修正不规则INI文件]
def __iniFileFix(errorline, iniFile, encoding):
# 备份INI文件名
newIniFile = iniFile + bakpostfix try:
fr = open(iniFile, 'r', encoding=encoding)
fw = open(newIniFile, 'w', encoding=encoding)
# 逐行读取
line = fr.readline()
lineno = 1
while line != '':
# 若到了问题行,则注释它
if lineno == int(errorline):
line = '; ' + line
# 逐行写入(修正后)
fw.writelines(line)
line = fr.readline()
lineno += 1
fr.close()
fw.close()
except Exception as e:
# 异常时返回报错信息
error = 'Error:[{0}]'.format(e)
print(error)
return error
# 正常时返回新文件名
return newIniFile ## [读取INI文件]
def getINIValue(iniFile, section, option):
config = configparser.ConfigParser()
value = '' # 备份文件
bBakFile = False # 异常:文件不存在
if (os.path.isfile(iniFile) == False):
print('Error: file "{0}" not exists...'.format(iniFile))
return None bException = True
# 尝试编码的次数
counter = 1
# 多次循环尝试修正INI为正确的格式,直到正常或遇到无法处理的异常
while bException:
try:
encoding = ''
# 依次进行如下编码打开尝试(后续根据需要添加)
if counter == 1: encoding = 'gb2312'
if counter == 2: encoding = 'utf-8'
if counter == 3: encoding = 'utf-16'
if counter == 4: encoding = 'gbk'
if counter == 5: encoding = 'gb18030'
if counter == 6:
# 暂无法处理的编码
print('Error: encoding unknown...')
return None
config.read(iniFile, encoding=encoding)
bException = False
except UnicodeDecodeError as e:
# 编码异常
print('Error:[{0}]'.format(e))
counter += 1
except (configparser.DuplicateSectionError, configparser.DuplicateOptionError) as e:
# SECTION重复异常
# Option重复异常
print('Error:[{0}]'.format(e))
excep = '{0}'.format(e)
errorline = excep[excep.find(' [line ') + len(' [line '):excep.find(']', excep.find(' [line '))]
iniFile = __iniFileFix(errorline, iniFile, encoding)
if iniFile.find('Error:[') == 0:
return None
bBakFile = True
except configparser.MissingSectionHeaderError as e:
# 缺少SECTION头异常
print('Error:[{0}]'.format(e))
excep = '{0}'.format(e)
errorline = excep[excep.find(', line: ') + len(', line: '):excep.find('\n', excep.find(', line: '))]
iniFile = __iniFileFix(errorline, iniFile, encoding)
if iniFile.find('Error:[') == 0:
return None
bBakFile = True
except Exception as e:
# 未知新异常(后续根据需要追加)
print('Error:[{0}]'.format(e))
return None # 删除INI备份文件
if bBakFile == True:
# 可能存在多个INI备份,循环删除
bMoreBakFile = True
while (bMoreBakFile):
os.remove(iniFile)
iniFile = iniFile[0:iniFile.rfind(bakpostfix)]
if iniFile.rfind(bakpostfix) == -1 :
bMoreBakFile = False # 多次循环尝试修正INI为正确的格式,直到正常或遇到无法处理的异常
bException = True
while bException:
try:
value = config.get(section, option)
bException = False
except configparser.NoSectionError as e:
# 找不到SECTION
print('Error:[{0}]'.format(e))
return None
except configparser.NoOptionError as e:
# 找不到Option(考虑到一种情况:上位指定.reg的Option时没加",自动追加)
print('Error:[{0}]'.format(e))
if option[0] != '"' and option[len(option)-1] != '"':
option = '"' + option + '"'
else :
return None
except Exception as e:
# 未知新异常(后续根据需要追加)
print('Error:[{0}]'.format(e))
return None return value

python学习笔记~INI、REG文件读取函数(自动修复)的更多相关文章

  1. Head First Python 学习笔记-Chapter3:文件读取和异常处理

    第三章中主要介绍了简单的文件读取和简单的异常处理操作. 首先建立文件文件夹:HeadFirstPython\chapter3,在Head First Pythong官方站点下载须要使用的文件:sket ...

  2. Python学习笔记之从文件中读取数据

    10-1 Python 学习笔记:在文本编辑器中新建一个文件,写几句话来总结一下你至此学到的Python 知识,其中每一行都以“In Python you can”打头.将这个文件命名为learnin ...

  3. Python学习笔记之—— File(文件) 对象常用函数

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 1.file.close() close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触 ...

  4. 转载-python学习笔记之输入输出功能读取和写入数据

    读取.写入和 Python 在 “探索 Python” 系列以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如tuple.string 和 list.其他文章讨论了 Pytho ...

  5. Python学习笔记六:文件处理

    一:打开文件 open(name,mode,[bufferSize]) name:文件路径 mode:文件打开方式 二:文件读取 read()方法:可以一次读取文件的全部内容,Python把内容读到内 ...

  6. 【学习笔记】tensorflow文件读取

    目录 文件读取 文件队列构造 文件阅读器 文件内容解码器 开启线程操作 管道读端批处理 CSV文件读取案例 先看下文件读取以及读取数据处理成张量结果的过程: 一般数据文件格式有文本.excel和图片数 ...

  7. Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

    文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...

  8. Python学习笔记_从CSV读取数据写入Excel文件中

    本示例特点: 1.读取CSV,写入Excel 2.读取CSV里具体行.具体列,具体行列的值 一.系统环境 1. OS:Win10 64位英文版 2. Python 3.7 3. 使用第三方库:csv. ...

  9. python学习笔记3.1_数据读取常用函数参数

    一.read_table/read_csv常用函数参数 1.path:表明文件系统位置的字符串.url或文件型对象 2.sep或delimiter:用于分隔每行字段的字符序列或正则表达式 3.head ...

随机推荐

  1. 查询组成员(group)

    查询组成员 $groupname = "groupname" $members = (get-adgroup $groupname -properties member).memb ...

  2. 一个典型的后台软件系统的设计复盘——(二)如何id一个事物

    这个话题,可以从类与对象说起. Dog dog1 = new Dog(); 哪个是类,哪个是对象?这个问题搞不清楚,后面就无从说起了.然后两个程序员之间沟通说,那个狗有问题.除非两人很默契,不然另一人 ...

  3. ZT 俞敏洪:2014我要闭嘴 相信未来不是梦

    俞敏洪:2014我要闭嘴 相信未来不是梦 手机免费访问www.cnfol.com2013年12月11日 08:38 中国企业家网 查看评论 字体:小  中  大中金在线微博微信加关注 扫描二维码 关注 ...

  4. 4.30-5.1cf补题

    //yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...

  5. Android(java)学习笔记1:多线程的引入

    1. 多线程的引入:

  6. ParameterDirection中的参数(Input,Output,InputOutput,ReturnValue)

    ParameterDirection中的参数类型定义,首先看ParameterDirection定义 // 摘要: // 指定查询内的有关 System.Data.DataSet 的参数的类型. pu ...

  7. 20165322 第九周 实现mypwd

    实现mypwd 学习pwd man pwd 该命令用来显示目前所在的工作目录 参数 -P显示当前目录的物理路径 -L显示当前目录的连接路径 man -k dir | grep 2 由图可知,可以用ge ...

  8. REG小探

    根键名称缩写对照表   常用数据类型

  9. TortoiseSVN 分支创建与合并

    前提准备: 确保本地Work Copy 和 服务器上的 版本一致.( 所有代码都提交到SVN,并update一次) 1  从主干创建分支代码 在本地Work Copy  选中项目文件夹,鼠标右键选择 ...

  10. I/O复用——各种不同的IO模型

    一.概述 我们看到上面的TCP客户同时处理两个输入:标准输入和TCP套接字.我们遇到的问题就是在客户阻塞于(标准输入上的)fgets调用期间,服务器进程会被杀死.服务器TCP虽然正确地给客户TCP发送 ...