Python(三十六)python文件操作常用模块(一)

94 阅读5分钟

一:Python pickle模块:实现Python对象的持久化存储

Pickle模块,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化。也就是说,pickle 可以实现 Python 对象的存储及恢复。

pickle 是 python 语言的一个标准模块,安装 python 的同时就已经安装了 pickle 库,因此它不需要再单独安装,使用 import 将其导入到程序中,就可以直接使用。

1:dumps():将 Python 中的对象序列化成二进制对象,并返回;

语法:

dumps(obj, protocol=None, *, fix_imports=True)

此格式中各个参数的含义为:

1)      obj:要转换的 Python 对象;

2)      protocol:pickle 的转码协议,取值为 0、1、2、3、4,其中 0、1、2 对应 Python 早期的版本,3 和 4 则对应 Python 3.x 版本及之后的版本。未指定情况下,默认为 3。

3)      其它参数:为了兼容 Python 2.x 版本而保留的参数,Python 3.x 中可以忽略。

实例:

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
p1 = pickle.dumps(tup1)
print(p1)

输出:

b'\x80\x03X\r\x00\x00\x00I love Pythonq\x00cbuiltins\nset\nq\x01]q\x02(K\x01K\x02K\x03e\x85q\x03Rq\x04N\x87q\x05.'

 

2:loads():读取给定的二进制对象数据,并将其转换为 Python 对象;

语法:loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')

实例:

import pickle
tup1 = ('I love Python', {1,2,3}, None)
p1 = pickle.dumps(tup1)
#使用 loads() 函数将 p1 转成 Python 对象
t2 = pickle.loads(p1)
print(t2)

输出:

('I love Python', {123}, None)

 

3:dump():将 Python 中的对象序列化成二进制对象,并写入文件;

语法:

dump (obj, file,protocol=None, *, fix mports=True)

其中各个参数的具体含义如下:

1)      obj:要转换的 Python 对象。

2)      file:转换到指定的二进制文件中,要求该文件必须是以"wb"的打开方式进行操作。

3)      protocol:和 dumps() 函数中 protocol 参数的含义完全相同,因此这里不再重复描述。

4)      其他参数:为了兼容以前 Python 2.x版本而保留的参数,可以忽略。

实例:

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open ("a.txt"'wb'as f: #打开文件
    pickle.dump(tup1, f) #用 dump 函数将 Python 对象转成二进制对象文件

打开a.txt文件,内容如下:

�
X
I love Pythonqcbuiltins
set
q]q(KKK
e�q
RqN�q.

4:load():读取指定的序列化数据文件,并返回对象。

语法:

load(file, *, fix_imports=True, encoding='ASCII', errors='strict')

实例:

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open ("a.txt"'wb'as f: #打开文件
    pickle.dump(tup1, f) #用 dump 函数将 Python 对象转成二进制对象文件
with open ("a.txt"'rb'as f: #打开文件
    t3 = pickle.load(f) #将二进制文件对象转换成 Python 对象
    print(t3)

输出:

('I love Python', {123}, None)

 

二:Python fileinput模块:逐行读取多个文件

Python 为我们提供了 fileinput 模块,通过该模块中的 input()  函数,我们能同时打开指定的多个文件,还可以逐个读取这些文件中的内容。

语法:fileinput.input(files="filename1, filename2, ...", inplace=False, backup='', bufsize=0, mode='r', openhook=None)

此函数会返回一个 FileInput 对象,它可以理解为是将多个指定文件合并之后的文件对象。其中,各个参数的含义如下:

1)      files:多个文件的路径列表;

2)      inplace:用于指定是否将标准输出的结果写回到文件,此参数默认值为 False;

3)      backup:用于指定备份文件的扩展名;

4)      bufsize:指定缓冲区的大小,默认为 0;

5)      mode:打开文件的格式,默认为 r(只读格式);

6)      openhook:控制文件的打开方式,例如编码格式等。

注意,和 open() 函数不同,input() 函数不能指定打开文件的编码格式,这意味着使用该函数读取的所有文件,除非以二进制方式进行读取,否则该文件编码格式都必须和当前操作系统默认的编码格式相同,不然 Python 解释器可能会提示 UnicodeDecodeError 错误。

1.png

代码示例:

import fileinput
 # 使用for循环遍历 fileinput 对象
 for line in fileinput.input(files=('log.txt''log1.txt')):
     # 输出读取到的内容
     print(line)
 # 关闭文件流
 fileinput.close()

输出:

https://guanchao.site
vvvvvvvvvvvvvvvvvvv
eeeeeeeeeeeeeeeeee
tttttttttttttttttt
aaaaaaaaaaaaaaa
bbbbbbbbbbbbbb
ccccccccccccccccccc
ddddddddddddddd

 

这个破玩意,读取的所有文件,除非以二进制方式进行读取,否则该文件编码格式都必须和当前操作系统默认的编码格式相同,不然 Python 解释器可能会提示 UnicodeDecodeError 错误。

 

三:Python linecache模块用法:随机读取文件指定行

除了可以借助 fileinput 模块实现读取文件外,Python 还提供了 linecache 模块。和前者不同,linecache 模块擅长读取指定文件中的指定行。换句话说,如果我们想读取某个文件中指定行包含的数据,就可以使用 linecache 模块。

使用linecache模块读取的文件,其编码格式也必须为 UTF-8,否则要么读取出来的数据是乱码,要么直接读取失败(Python 解释器会报 SyntaxError 异常)。

2.png

示例:

import linecache
 import string
 #读取string模块中第 3 行的数据
 print(linecache.getline(string.__file__, 3))
 # 读取普通文件的第2行
 print(linecache.getline('log.txt'2))

输出:

Public module variables:
vvvvvvvvvvvvvvvvvvv

 

有好的建议,请在下方输入你的评论。