Python 二进制文件--Excel文件--xml文件--配置文件的操作

1.二进制文件的输入输出

(1)、struct和pickle<br>

使用struct模块,进行数据的输入输出

使用步骤:

第一,对要写入到文件中的各种类型数据,进行统一打包

struct.pack('if',10,12.4),其中,i:代表了整数,f:代表了浮点数

?:代表布尔型

第二,使用write()写入,写入后以二进制的方式进行文件存储。

第三,读取时,首先采用struct.unpack()来解包里面包含的相关数据,返回一个序列,即写入时的顺序,与读取时的顺序应该一致。

注意:需要将所有写入的数据,一次性都封装到一个bytes中,因为在Python中没有byte的概念,所以需要第三方的模块进行封装。

使用pickel模块,进行数据的输入输出

使用步骤:

第一,对要写入文件中的数据,进行逐一的写入。例如:

f = open('myfile.dat','wb')

pickle.dump(10, f)

第二,读取数据时,同理,需要逐一的读取。例如:

pickle.load(f)

注意,在使用时,我们能够观察到该模块的dump和load函数,与前面所学的json模块的函数一致,在Python中json与pickle都能够实现序列化和反序列化的两个模块。

在实际的使用中,推荐使用pickle 模块。

(2)文件定位

函数格式:seek(n)

返回值:返回指定的位置

说明:通过指定元素的位置,将文件指针移动到该位置。

seek()函数有三个固定值,分别为:0,1,2

0:文件的开头

1:文件当前的位置

2:文件的结尾位置

seek(0,2):代表着将指针定位到文件尾,然后进行添加操作

seek(0,1):代表着在当前指针的位置,进行替换

补充:对文件的读取时,如果文件大小未知,切忌不要使用read(),readline(),readlines()将文件内容一次性读取到内存中。因为有可能文件内容过多,造成读取时的IO阻塞。建议,将文件分多次分批读入内存中。我们通常可以先获取到文件大小,

size = path.getsize('myfile.txt')#获取'myfile.txt'文件的大小

根据其大小来判断我们采用何种方式进行读取数据内容。

2.对Excel文件的操作

1、需要三个主要的模块

xlrd:用来读取Excel文件中的内容

xlwt:用来生成Excel文件

xlutils:用来实现Excel文件的复制

2、

首先:xlrd

open_workbook()

函数格式:open_workbook(文件名)

返回值:返回Excel对象

说明:打开指定的Excel文件,生成一个Excel对象用来实现读取行、列及单元格内容

函数格式:sheet_by_name(sheet页面名)/sheet_by_index(sheet页索引位,默认从0开始)

返回值:sheet页对象

说明:找到指定的sheet页,生成一个对应的sheet页对象,对其内部的数据进行检索

函数格式:sheet.cell(rownum,colnum)

返回值:返回指定行列的单元格对象,如果要获取其中的内容,调用value属性。

说明:通过指定行、列,能够确认一个单元格。

其次:xlwt

函数名称:Workbook()

返回值:返回一个新创建的Excel空对象

说明:该函数用来生成一个Excel对象,但是该对象没有任何内容

函数名称:add_sheet(sheet名字)

返回值:返回一个新创建的sheet页对象

说明:该函数用来新增一个空的sheet页对象

函数名称:write(row, col, value)

返回值:无

说明:对指定的行列单元格内,写入value内容。

最后:xlutils

函数格式:copy(Excel对象)

返回值:返回一个指定对象的副本

说明:在Python中对Excel的修改,都是生成一个对应的副本,修改后保存。

函数格式:get_sheet(索引位)

返回值:返回一个指定对象副本中的sheet页

说明:我们实际修改的数据,都是位于sheet页中。因此要获取到指定的sheet页。

练习:将列表元素读入Excel文件,并实现读出与更新操作。

import xlwt #写Excle文件,选用该模块
import xlrd #读Excel文件,选用该模块
from xlutils.copy import copy
def save_excel(title,data): 
    #生成Excel对象
    wbt=xlwt.Workbook()
    #生成一个sheet页
    sheet=wbt.add_sheet('人员信息表')
    for i in range(len(title)):
        sheet.write(0,i,title[i])
    for m in range(len(data)):
        for n in range(len(data[m])):
            sheet.write(m+1,n,data[m][n])
    wbt.save('person.xls')
def read(bookname,sheetname):
    #打开Excel文件
    wb=xlrd.open_workbook(bookname)
    sheet=wb.sheet_by_name(sheetname)
    #for rownum in range(sheet.nrows):
        #print(sheet.row_values(rownum))
    #cell=sheet.cell(0,1).row_values
    for rownum in range(1,sheet.nrows):
        for colnum in range(sheet.ncols):
            print(sheet.cell(rownum,colnum).value,end=' ')
        print()
def update(bookname,sheetname):
    wb=xlrd.open_workbook(bookname)
    sheet=wb.sheet_by_name(sheetname)
    new_wb=copy(wb)  #将原有的Excel,拷贝一个新的副本
    new_sheet=new_wb.get_sheet(0)
    new_sheet.write(3,0,'小彬彬')
    new_wb.save('person_new.xls')#如果还写原文件名,会覆盖原文件
if __name__=='__main__':
    title=['姓名','年龄','性别','出生年月','家庭住址','婚姻状况','身份证号码']#作为Excel中的标题名称
    #生成Excel中的数据
    data=[
        ['小文',22,'女','19980101','不祥','不祥','410111111111111111'],
        ['小宾宾',21,'男','19981010','河南省郑州','已婚','411111111111111111'],
        ['丹丹',22,'女','19980210','河南郑州','已婚','412111111111111111']
    ]
    bookname='person.xls'
    sheetname='人员信息表'
save_excel(title,data)
read(bookname,sheetname)
update(bookname,sheetname)

3.对XML文件的解析

1、XML解析的两种方式:DOM与SAX

DOM:文档对象模型,是Python处理XML文件的标准模式。一个DOM的解析器在解析XML文档时 ,一次性读入整个文档,把文档中的所有元素(标签和文本)保存在内存中的一个树形结构,然后我们可以利用DOM提供的各种函数,来读取或修改文档中的内容。

练习:

from xml.dom import minidom  #引入minidom,以dom方式解析xml文件
#打开xml文件
dom=minidom.parse('test.xml')
#得到文档的元素对象
root=dom.documentElement
#print(root.nodeName) #获得节点名,即标签名 
#print(root.nodeValue) #获得节点值
#print(root.nodeType)  #获得节点类型
node=root.getElementsByTagName('car')#获得在根节点下,所有名字为car的节点对象
#获得car节点中,第一个节点中brand子节点的文本内容
#print(node[0].getElementsByTagName('brand')[0].firstChild.data) 
for i in range(len(node[0].childNodes)):
    if node[0].childNodes[i].nodeType==1:
        print(node[0].childNodes[i].nodeName,end=' ')
print()
for i in range(len(node)):
    print(node[i].getElementsByTagName('brand')[0].firstChild.data,end=' ')
    print(node[i].getElementsByTagName('company')[0].firstChild.data,end=' ')
    print(node[i].getElementsByTagName('price')[0].firstChild.data,end=' ')
    print(node[i].getElementsByTagName('color')[0].firstChild.data,end=' ')
    print(node[i].getElementsByTagName('type')[0].firstChild.data,end=' ')
    print(node[i].getElementsByTagName('country')[0].firstChild.data,end=' ')
    print()

刚刚的练习也可以导入xml.etree模块操作

import xlwt
from xml.etree import ElementTree
tree=ElementTree.parse('test.xml')
root=tree.getroot() 
list1=list()
list2=list()
    #获取根节点
for child in root:
    for node in child:
        print(node.text,node.tag,end=' ')
    print()

'''#递归
def parsexml(element):
    list1=[]
    for i in element:
        if i.tag !='car':
            print(i.tag,end=' ')
    if len(element)>0:
        for i in element:
            if i.tag !='car':
                print(i.text,end=' ')

            parsexml(i)
        print()
parsexml(root)
'''

SAX解析文件步骤:
1、创建解析器
parser = sax.make_parser()
2、读取xml文档
xml.sax.parse(xmlfile)
3、设置ContentHandler对象,重写startDocument、endDocument、startElement、endElement方法

startDocument():文档载入时调用,文档开始
endDocument():当解析器达到文档结尾时调用
startElement(name,attrs):当遇到XML标签时调用,name是标签的名字,attrs标签的属性字典
endElement(name):当遇到XML标签结束时调用,name是标签名
4、使用SAX解析文件,需要为解析器配置ContentHandler,定义了如何解析标签,以及处理标签间文本内容的业务逻辑。
carhandler = CarHandler()
parser.setContentHandler(carhandler)

猜你喜欢

转载自blog.csdn.net/qq_35328369/article/details/81568854