Python3 File Handling

写在开头

这部分内容有时挺易混的, 故整理出本文作备忘录使用
本文缝了一大堆东西, 它们来自官方文档、网络和自己大一大二时零零散散的笔记.
以下内容基于: Python3.11

读写文本文件

我觉得这里总结得比我好, 而且这块内容实际应用的时候基本不会出什么大问题, 绝无可能是我懒得写.

tips: read开头的三个方法的区别:
read()如果没有指定字节数, 就读取全部
readline()返回一行
readlines()返回所有行构成的的列表

序列化与反序列化(使用pickle)

pickle特性

  • 快, 但不安全(无加密, 无数字签名)
  • 简单好使

基本用法

使用pickle.dump()pickle.load()

写二进制文件: pickle.dump(obj, file)

1
pickle.dump(_obj_, _file_, _protocol=None_, _*_, _fix_imports=True_, _buffer_callback=None_)

它等同于 Pickler(file,protocol).dump(obj)

将对象 obj 封存以后写入已打开的file object file.
我就经常干蠢事: 忘记要先使用open()等方法打开文件再进行序列化

读二进制文件: pickle.load(file)

1
pickle.load(_file_, _*_, _fix_imports=True_, _encoding='ASCII'_, _errors='strict'_, _buffers=None_)

它相当于 Unpickler(file).load()

从已打开的 file object 中读取封存后的对象,重建其中特定对象的层次结构并返回.

Pickle 协议版本是自动检测出来的,所以一般不需要参数来指定协议。封存对象以外的其他字节将被忽略。

使用例

这两个函数用于将对象序列化到文件从文件中反序列化对象。
原始数据:

1
data = {'a': 1, 'b': 2, 'c': 3}

序列化到文件

1
2
with open('serialized_data.pkl', 'wb') as f:         
pickle.dump(data, f)

data对象序列化到名为serialized_data.pkl的文件中。

从文件中反序列化

1
2
with open('serialized_data.pkl', 'rb') as f:    
data_from_file = pickle.load(f)

从文件serialized_data.pkl中读取并反序列化对象。

本例中,从文件中加载的数据输出如下:

1
{'a': 1, 'b': 2, 'c': 3}

补充: 直接操作(不涉及文件)

使用pickle.dumps()pickle.loads()
这两个函数直接在内存中操作,不涉及文件系统. 也算是比较常用.
直接用例子:

原始数据:

1
data = {'a': 1, 'b': 2, 'c': 3}

序列化

1
serialized_data = pickle.dumps(data)

python对象data被序列化为字节对象serialized_data

反序列化

1
deserialized_data = pickle.loads(serialized_data)

字节对象serialized_data被反序列化为原始的Python对象deserialized_data

本例中,输出如下:

1
2
3
4
# Serialized with dumps(): 
b'\x80\x04\x95\x17\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x01a\x94K\x01\x8c\x01b\x94K\x02\x8c\x01c\x94K\x03u.
# Deserialized with loads():
{'a': 1, 'b': 2, 'c': 3}

可以看到dumps()之后直接就是bytes类型, 存储在变量serialized_data中.

压缩与解压缩(使用gzip)

基本用法

读压缩文件: gzip.open(filename:str, mode: str)

1
gzip.open(_filename_, _mode='rb'_, _compresslevel=9_, _encoding=None_, _errors=None_, _newline=None_)

以二进制方式或者文本方式打开一个 gzip 格式的压缩文件,返回一个file object.

filename 参数可以是一个实际的文件名,或者是一个用来读写的已存在的文件对象。

mode 参数可以是二进制模式: 'r''rb''a''ab''w''wb''x' or 'xb' 
也可以是文本模式 'rt''at''wt', or 'xt'。默认值是 'rb'

写压缩文件

使用gzip.open()打开压缩文件后得到文件对象, 使用诸如write()等方法正常写入即可.

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 读取压缩文件:
with gzip.open('/path/to/file/file.txt.gz', 'rb') as f:
file_content = f.read()

# 创建GZIP文件
content = b"contents"
with gzip.open('/path/to/file/file.txt.gz', 'wb') as f:
f.write(content)

# 使用GZIP压缩已打开的文件对象
with open('/path/to/file/file.txt', 'rb') as f_in:
with gzip.open('/path/to/file/file.txt.gz', 'wb') as f_out:
cont = f_in.read()
f_out.write(cont)

文件指针操作: seek(offset)

seek() 方法用于移动文件读取指针到指定位置。

语法

1
fileObject.seek(offset[, whence])

fileObject可以是任何已经存在的用来读写的文件对象

参数

  • offset – 开始的偏移量,也就是代表需要移动偏移的字节数
  • whence: 可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移:
    • 0代表从文件开头开始算起,
    • 1代表从当前位置开始算起
    • 2代表从文件末尾算起。

返回值

如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。

shelve 模块

(这部分用的比较少, 原始笔记里有, 我删了)
通过shelve.open()方法打开一个shelve对象后,就可以使用类似字典的方式操作这个对象中的键值对.
具体用法省略

请注意…

本文中的所有内容均不会用于商业用途.

本文所用资料是我从网上搜寻和积累的. 本文的某些部分是拿资料直接cv之后改了两下扔进去的
我在网上冲浪的时候遇到自己感觉不错的文章和资料有时会把它们节选后存下来. 时间一长, 它们干脆就成了我pc硬盘中某些阴暗角落里的住民, 常年不见天日.
这时候麻烦又来了: 我经常忘记加作者和链接tag, 所以时间一长, 部分信息来源已不可考, 连我自己都忘了.
所以如果您发现这篇文章中的某一部分很眼熟, 那大概率就是缝的您的.请联系我注明出处!(当然让我删了也行)


Python3 File Handling
http://example.com/2024/03/08/Python3-File-Handling/
作者
TVEM
发布于
2024年3月8日
许可协议