今天在做项目的时候,要求解析word的xml文件,经过研究发现,将word文件的后缀名改为.zip解压后就可以在word文件夹中找到一个名为document.xml的xml文件。里面包含了word的结构和所有文本内容。
但是作为一个python程序员,如何用python优雅的解决这个问题呢?这就需要使用Python中的ZipFile模块了。
zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo,在绝大多数的情况下,我们只需要使用这两个class就可以了。
- ZipFile是主要的类,用来创建和读取zip文件。
- ZipInfo是存储的zip文件的每个文件的信息的。
infolist(), 它返回的就是压缩包内所有文件的信息,就是一个ZipInfo的列表。一个ZipInfo对象中包含了压缩包内一个文件的信息,其中比较常用的是 filename, file_size, header_offset, 分别为文件名,文件大小,文件数据在压缩包中的偏移。
例:
zip_file = zipfile.ZipFile(filename, 'r')
for zip in zip_file.infolist():
print(zip.file_size, zip.header_offset )
而我接下来用的namelist()就是读取的ZipInfo中的filename,组成一个 list返回
比如要读取一个解压一个zip文件模块,这里假设base_path是一个文件的路径:
import zipfile
os.chdir(base_path) # 切换到base_path路径下
base_name = os.path.splitext(word_name)[0] # 读取word文档后缀前的部分
os.rename(word_name, base_name + ".zip") # 修改word文件的后缀为zip
zip_word = zipfile.ZipFile(base_name + ".zip", 'r') # 读取压缩文件
for file in zip_word.namelist(): # 遍历压缩包中所有文件名
zip_word.extract(file) # 将文件解压
以下是一些常规压缩使用方法
#下面是创建zip压缩包的方法,与读取的方法其实很类似的:
import zipfile, os
zip_file = zipfile.ZipFile(filename, 'w')
# 注意这里的第二个参数是w,这里的filename是压缩包的名字
#假设要把一个叫testdir中的文件全部添加到压缩包里(这里只添加一级子目录中的文件)
if os.path.isdir(testdir):
zip_file = zipfile.ZipFile(zip_name, 'w')
for dir in os.listdir(testdir):
zip_file.write(testdir+os.sep+dir)
zip_file.close() # close() 是必须调用的!
# 代码非常的简单。
# 想想还有一个问题,如果我把一个test/111.txt 添加到压缩包里之后我希望在包里它放到test22/111.txt怎么办呢?
# 其实这个就是Python ZipFile模块的write方法中第二个参数的作用了。只需要这样调用:
zip_file .write("test/111.txt", "test22/111.txt")