在与Python程序同一个目录下,我们有一个名为 pi.txt 的文件,它的内容如下:
现在使用Python来打开和关闭它:
执行此程序不会有任何输出,这表示着打开和关闭文件都得到了正确执行。
可以看到,使用 open() 函数打开文件,参数为文件名(或文件路径);该函数会返回一个文件句柄,文件句柄并不会实际保存文件的内容,而是代表着一种操作,在上面的例子中,文件句柄被赋值给变量 fhand 。
打开文件后,程序具有读(默认)该文件的权限。
最后,使用文件句柄的 close() 方法关闭文件。这非常重要,因为使用完而没有关闭的文件会占用内存或造成安全问题。
如果Python找不到该文件,则会返回错误,比如下面这样:
Python提示我们没有相应的文件或者目录: 'pii.txt'。
打开文件后就可以对文件进行操作:
fhand.read() 方法将文件内容作为一个字符串返回。
文件中的每一行末尾使用换行符 \n 表示换行,例子中方法 rstrip() 去掉文本中的换行符,然后输出。
程序的运行效果如下:
如果在文件关闭之前程序发生BUG意外退出,则文件不会关闭,为了避免此类事件的发生,可以使用 with 语句:
with 语句的特点是即便在操作文件时发生错误,文件也会自动被清理。
fhand.read() 虽然可以读取文本内容,但是当我们想要逐行处理文件内容,或者文件很大而无法一次性加载进内存的时候,就不适用了。
可以使用 for 语句逐行处理文件内容:
本程序中将文件名保存在变量 filename 中。
打开文件后,使用 for 语句按行读取文件内容。例子中,每次循环依次取一行文本以字符串的格式保存在变量 line 中,每次循环中变量 count 自增1。
这个程序的作用是,打开程序所在目录的 when_old.txt 文件,然后统计行数,并输出结果。
when_old.txt 文件的内容是:
可以使用其他方法操作字符串 line :
程序将以 'And' 开头的行打印出来。
打开文件后,默认的权限是读(r),如果要写文件,则需要使用写(w)或者追加(a)权限。
w权限,打开一个文件用于写入。如果该文件存在,则覆盖该文件;如果该文件不存在,则创建该文件。
a权限,打开一个文件用于追加。如果该文件存在,在文件末尾追加;如果该文件不存在,则创建该文件。
下面是一个使用w权限打开文件的例子:
例子中使用w权限打开该文件,并写入两行。(如果该文件存在,则内容会被覆盖)
fhand.write() 不会自动添加换行符,所以如果需要换行,需在末尾添加 \n 。
下面我们写一个统计文件中词频的程序。
它会统计文件中各个词的出现的次数,然后由高到低显示出前5个词。
首先我们完成打开和关闭文件的程序内容:
在例子中,由用户输入文件名,并且使用异常捕获以处理文件打开时的错误。
下面对内容进行统计:
这个程序:
如此,我们就在字典中存放了 单词:次数 的键值对。
由于字典不能保存顺序,所以不能对其进行排序。为此,将每个键值对都添加到一个列表中:
在列表 word_list 中,每一项都是一个元组,每个元组第一个值是单词出现的次数,第二个值是单词内容。
对其进行逆向(由大到小)排序:
打印最终结果:
整个程序如下:
下面是程序运行结果的示例:
Zip文件格式是通用的文档压缩标准。自1.6版本起,Python中zipfile模块能够直接处理zip文件里的数据,例如需要将对应目录或多个文件打包或压缩成zip格式,或者需要查看一个zip格式的归档文件中部分或者所有文件同时避免讲这些文件展开到磁盘上。使用ZipFile类来操作zip文件。
创建一个ZipFile对象,表示一个zip文件。
参数file:文件的路径或者类似文件对象
参数mode:读"r",写入"w",添加"a"
参数compression: ZIP_STORED(无压缩),ZIP_DEFLATED(压缩,需要zlib支持)
参数allowZip64:默认情况下报错,将其设为True,ZipFile将用ZIP64扩展进行创建文件。
下面示例演示了读取一个zip文档,将文档里所有文件解压到名为"work"的文件里。
import zipfile
if __name__ == "__main__":
zFile = zipfile.ZipFile("F:\\txt.zip","r")
#ZipFile.namelist():获取ZIP文档内所有文件的名称列表
for fileM in zFile.namelist():
zFile.extract(fileM,"F:\\work")
zFile.close()
read(self,name,pwd=None)获取ZIP文档内文件的二进制数据
下面例子演示了使用read方法获取ZIP文档中mango.txt文件的数据,并写到copy.txt文件中
import zipfile
if __name__ == "__main__":
zipFile = zipfile.ZipFile('F:\\test.zip','r')
data = zipFile.read("mango.txt")
(lambda f,d:(f.write(d),f.close()))(open("F:\\copy.txt,'w"),data)
zipFile.close()
write(self, filename, arcname=None, compress_type=None)将指定文件写入ZIP文档中
参数filename:需要写入文件的路径
参数arcname:文件写入ZIP文档后保存的文件名
参数compress_type:压缩方法(ZIP_STORED或ZIP_DEFAULED)
下面离子演示了创建一个zip文档,将test.docx文件写入压缩文档里面。
import zipfile
if __name__ == "__main__":
zipFile = zipfile.ZipFile("F:\\test.zip","w")
zipFile.write("F:\\test.docx","ok.docx",zipfile.ZIP_DEFLATED)
zipFile.close()
getinfo(name)返回一个ZipInfo类的对象。
import zipfile
if __name__ == "__main__":
zipInfo = zipFile.getinfo(ok.docx)
print("filename:",zipInfo.filename)
print("date_time:",zipInfo.date_time)
常用函数
关闭归档文件,你必须在退出程序之前调用close()否则将不会写入关键记录数据。
返回一个ZipInfo对象,其中包含有关归档成员name的信息。针对一个目前并不包含于归档中的名称调用getinfo()将会引发KeyError。
返回一个列表,其中包含每个归档成员的ZipInfo对象。如果是打开一个现有归档则这些对象的排列顺序与他们对于条目在磁盘上的实际ZIP文件中的顺序一致。
返回按名称排列的归档成员列表。
以二进制文件类对象的形式访一个归档成员。name可以是归档内某个文件的名称也可以是某个ZipInfo对象。如果包含了mode形参,则它必须为"r"(默认值)或"w"。pwd为用于解密已加密Zip文件的密码。
open()也是一个上下文 管理器,因此支持with语句:
with ZipFile('spam.zip') as myzip:
with myzip.open('eggs.txt') as myfile:
print(myfile.read())
如果mode为“r”则文件类对象(ZipExtFile)将只读并且提供下列方法:read(),readline(),readlines(),seek(),tell(),__iter__(),__next__()。这些对象可独立于ZipFile进行操作。
如果mode='w'则返回一个可写入的文件句柄,它将支持write()方法。当一个可写入的文件句柄被打开时,尝试读写ZIP文件中的其他文件将会引发ValueError。
当写入一个文件时,如果文件大小不能预先确定但是可能超过2GiB,可传入force_zip64=True以确保标头格式能够支持超大文件。如果文件大小可以预先确定,则在构造ZipInfo对象时应设置file_size,并将其作name形参。
从归档中提取一个成员放入当前工作目录;member必须为成员的完整名称或ZipInfo对象。成员的文件信息会尽可能精确地被提取。path指定一个要提取到的不同目录。member可以是一个文件名或ZipInfo对象。pwd是用于解密文件的密码。返回所创建的经正规化的路径(对应于目录或新文件)。
从归档中提取出所有成员放入当前工作目录。path指定一个要提取到的不同的目录。members为可选项且必须为namelist()所返回列表的一个子集。pwd是用于解密文件的密码。
警告:绝不要未经预先检验就从不可靠的源中提取归档文件。 这样有可能在 path 之外创建文件,例如某些成员具有以 "/" 开始的文件名或带有两个点号 ".." 的文件名。 此模块会尝试防止这种情况。 参见 extract() 的注释。
将归档是目录表打印到sys.stdout.
设置pwd为用于提取已加密文件的默认密码。
返回归档中文件name的字节数据。name是归档中文件的名称,或是一个ZipInfo对象。归档必须以读取或追加方式打开。pwd为用于已加密文件的密码,并且如果指定该参数则它将覆盖通过setpassword()设置的默认密码。 on a ZipFile that uses a compression method 在使用 ZIP_STORED , ZIP_DEFLATED , ZIP_BZIP2 或 ZIP_LZMA 以外的压缩方法的 ZipFile 上调用 read() 将引发 NotImplementedError 。 如果相应的压缩模块不可用也会引发错误。
读取归档中的所有文件并检查他们的CRC和文件头。返回第一个已损坏文件的名称,在其他情况下则返回None。
将名为filename的文件写入归档,给予的归档名为arcname(默认情况下将与filename一致,但是不带驱动器盘符并会移除开头的路径分隔符)。compress_type如果给出,它将覆盖作为构造器compression形参对于新条目所给出的值。类似地,compresslevel如果给出也将覆盖构造器。归档必须使用"w","x“或"a"模式打开。
将一个文件写入归档。 内容为 data ,它可以是一个 str 或 bytes 的实例;如果是 str ,则会先使用 UTF-8 进行编码。 zinfo_or_arcname 可以是它在归档中将被给予的名称,或者是 ZipInfo 的实例。 如果它是一个实例,则至少必须给定文件名、日期和时间。 如果它是一个名称,则日期和时间会被设为当前日期和时间。 归档必须以 'w', 'x' 或 'a' 模式打开。
ZIP文件的名称