python复习第8天:文件读写
title: python复习100天--第8天
date: 2020-03-15 21:00:24
tags:
- python
- 基础
categories: python复习
top: 9
文件读写
简单读写
- python常使用open函数对文件进行读写,返回一个文件操作对象
- open函数用于打开文件,write方法写入文件对象,close关闭文件对象。
- 使用方法1
# 写一个空白文件并且保存
f = open('001.txt', 'wt')
f.write('hehe') # 写入内容
f.close() # 关闭文件
# 写完后,你的路径下会多一个001.txt文件
-
通常来说,用Python打开文件后需要关闭该文件,否则容易引起内存泄露
-
为了防止忘记关文件,Python可以使用with open() as xx的方法读写文件。
-
使用方法2
# 写一个空白文件并且保存
with open('002.txt', 'wt') as f:
f.write('hehe') # 写入内容
# 这里不需要写f.close(),因为文件会自动关闭。
常用读写模式
-
open函数中共有两个关键参数,还有一个可选参数:编码方式(文本模式下默认utf-8)
-
关键参数分别为读写的文件名和读写模式
-
读写模式由两部分构成,一:读取方式;二:读取类型
读写方式 | 英文全称 | 使用结果 |
---|---|---|
w | write | 覆盖写入,即不考虑原来文件是否存在,也不考虑文件是否存在内容,均对其覆盖重建文件。 |
r | read | 读取文件,读取的文件必须存在,如果不存在会保存。 |
a | append | 追加写入,即在末尾添加新内容。如果不存在该文件,则自动创建新文件。 |
读取类型 | 英文全称 | 使用结果 |
---|---|---|
t | text | 按文本类型对文件进行操作,t可以省略。txt,json,xml,html都可以看成是文本。 |
b | binaray | 按二进制进行操作。一般来说,像图片,音乐,视频都是用二进制进行操作。 |
-
+
号可以用来对文件进行读写,如果是w+
、r+
则为头写入,即覆盖写入,a+
则为末尾追加写入。 - 所有模式大全
模式 | 描述 |
---|---|
r | 只读文本模式打开,需要文件存在。等同于rt。 |
rb | 只读二进制模式打开,需要文件存在。 |
r+ | 读写文本模式打开,如果是写入则会覆盖源文件。 |
rb+ | 读写二进制模式打开,如果是写入则会覆盖。 |
w | 写入文本模式打开,如果不存在则创建新文件。如果存在则覆盖源文件内容。 |
w+ | 读写文本模式打开,比w多了一个读取功能。 |
wb | 写入二进制文件。 |
wb+ | 读写二进制文件 |
a | 追加写入文本模式 |
ab | 追加写入二进制模式 |
a+ | 追加写入+读取文本模式 |
ab+ | 追加写入+读取二进制模式 |
-
读写文本模式对比(二进制模式同上)
| 功能 | r | r+ | w | w+ | a | a+ |
| :--------: | :--: | :--: | :--: | :--: | :--: | :--: |
| 读 | * | * | | * | | * |
| 写 | | * | | * | | * |
| 创建 | | | * | * | * | * |
| 覆盖 | | | * | * | | |
| 从开始读写 | * | * | * | * | | |
| 从结尾读写 | | | | | * | * | -
总结就是:
-
+
可以读取写入 - r只能读,w只能覆盖写,a是追加写。
- r+不能打开不存在的文件,w+和a+可以。
- r+和w+都是从头开始读取写入,a+是从上次结尾处读取写入。
-
文件读取
- 文件读取必须保证文件已经打开,常使用read方法进行读取。
# 自己创建一个“静夜思.txt”,将诗的内容复制进去
# 打开静夜思.txt,读取该文件
f = open('静夜思.txt', 'rt')
str1 = f.read() # 可以在括号里面输入数字,表示读取多少个字符,
# 不输入默认读取所有字符
print(str1)
"""
# 输出结果
床前明月光,疑是地上霜。
举头望明月,低头思故乡。
"""
- 也可以使用readline函数读取单行
# 自己创建一个“静夜思.txt”,将诗的内容复制进去
# 打开静夜思.txt,读取该文件
f = open('静夜思.txt', 'rt')
str1 = f.readline() # 第一次读取第一行
str2 = f.readline() # 第二次读取第二行
print(str1, str2)
f.close()
"""
# 输出结果
床前明月光,疑是地上霜。
举头望明月,低头思故乡。
"""
- 也可以使用readlines一次性读取所有行,读取结果是一个列表。
# 自己创建一个“静夜思.txt”,将诗的内容复制进去
# 打开静夜思.txt,读取该文件
f = open('静夜思.txt', 'rt')
list1 = f.readlines()
print(list1)
f.close()
"""
# 输出结果
['床前明月光,疑是地上霜。\n', '举头望明月,低头思故乡。']
"""
- tell方法获取读取的指针所在位置。
# 自己创建一个“静夜思.txt”,将诗的内容复制进去
# 打开静夜思.txt,读取该文件
f = open('静夜思.txt', 'rt')
print('文件操作前指针位置', f.tell(), '\n')
str1 = f.readline()
print('读取一行后的指针位置', f.tell(), '\n')
str2 = f.readline()
print('读取所有内容后的指针位置', f.tell(), '\n')
print(str1, str2)
"""
# 输出结果
文件操作前指针位置 0
读取一行后的指针位置 37
读取所有内容后的指针位置 73
xulieh
床前明月光,疑是地上霜。
举头望明月,低头思故乡。
"""
-
seek方法可以让读取写入的指针进行跳转。
-
使用方法:f.seek(x, mode)
-
mode共有三种,0:代表从起始位置开始算,1:代表从当前位置往后移动,2代表从结尾的位置往前移动,表示导入第x个位置。
-
x代表移动距离,如果mode=2,那么x必须为负数,代表倒数第几个字符。
# 自己创建一个“静夜思.txt”,将诗的内容复制进去
# 打开静夜思.txt,读取该文件
f = open('静夜思.txt', 'rb') # 以二进制格式打开,防止可能出现的中文报错
print('当前指针位置', f.tell())
f.seek(6, 0) # 从头开始计算,把指针移动到第4个字符上
str1 = f.read(1)
print('当前指针位置', f.tell())
print(str1) # 打印当前指针指向的字符
f.seek(4, 1) # 从当前位置往后移动2个
str2 = f.read(1)
print('当前指针位置', f.tell())
print(str2)
f.seek(-2, 2) # 跳转到倒数第2个字符
str3 = f.read(1)
print('当前指针位置', f.tell())
print(str3)
f.close()
"""
# 输出结果
当前指针位置 0
当前指针位置 7
b'\xe6'
当前指针位置 12
b'\x88'
当前指针位置 72
b'\x80'
"""
总结
- 文件读写常用方法总结
常用方法 | 功能描述 |
---|---|
open | 打开文件,是读写文件的前提 |
write | 写入内容到文件,需要有写入权限 |
read | 读取文件内容,默认读取所有内容,返回字符串 |
readline | 读取单行内容,返回字符串 |
readlines | 读取所有行内容,返回列表 |
tell | 给出当前指针位置 |
seek | 跳转指针位置 |
close | 关闭文件,防止内存占用 |
对象序列化和反序列化
序列化作用
- 可以实现对象,比如列表,字典永久储存,而不用转成字符串后储存为文本。
- 可以让对象边运行边储存,实现持久化运行,减少转化步骤和时间
反序列化作用
- 可以让序列化的内容转化成对象直接使用。
- 反序列化不需要再转格式,保证了对象的真实可靠性
使用方法
- 先导入pickle函数
- 使用dump将对象序列化成二进制文件
- 使用load将二进制文件反序列化为对象
import pickle
dict1 = {'key1': 'value1'} # 定义一个简单字典
f = open('001.pkl', 'wb') # pkl为pickle文件的后缀
pickle.dump(dict1, f) # 将dict1序列化到001.pk1文件中
f.close()
# 结果会生成一个001.pkl文件
import pickle
f = open('001.pkl', 'rb')
dict2 = pickle.load(f)
print(dict2)
print(type(dict2))
f.close()
"""
{'key1': 'value1'}
<class 'dict'>
"""
- 通过序列化和反序列化,可以让对象的内容和类型均不发生改变,这样就可以让对象运行、对象本地储存同时进行,实现可持续化运行。
- dump方法用于本地储存,dumps则不储存,而是直接查看序列化后的二进制内容。
- load方法用于本地文件加载,而loads则用于pickle二进制内容转python对象。
import pickle
dict1 = {'key1': 'value1'}
b1 = pickle.dumps(dict1)
with open('001.pkl', 'wb') as f:
f.write(b1)
import pickle
f = open('001.pkl', 'rb')
str1 = f.read() # 以二进制方式读取其内容
dict1 = pickle.loads(str1) # 二进制转对象
print(dict1)
print(type(dict1))
f.close()
"""
# 输出结果
{'key1': 'value1'}
<class 'dict'>
"""
- 上面两个代码块和之前的代码块一致。
json序列化和反序列化
- pickle用于对象转二进制文件的序列化,json则用于对象转文本后的序列化
- 使用json.dump可以将对象转文本文件的序列化
- 使用json.load可以将文本文件转对象格式的反序列化
import json
dict1 = {'key1': 'value1'}
f = open('001.json', 'wt') # 以文本模式打开
json.dump(dict1, f)
f.close()
# 运行结束后,将会多出一个001.json文件
import json
f = open('001.json', 'rt') # 以文本读取模式打开
dict1 = json.load(f)
print(dict1)
print(type(dict1))
f.close()
# 输出结果
"""
{'key1': 'value1'}
<class 'dict'>
"""
- 同样的json.dumps用于将对象转成文本内容(序列)
- json.loads用于将文本内容转成对象(反序列)
import json
dict1 = {'key1': 'value1'}
str1 = json.dumps(dict1)
f = open('001.json', 'wt') # 以文本模式打开
f.write(str1)
f.close()
# 运行结束后,将会多出一个001.json文件
import json
f = open('001.json', 'rt') # 以文本模式打开
str1 = f.read()
dict1 = json.loads(str1)
print(dict1)
print(type(dict1))
f.close()
# 输出结果
"""
{'key1': 'value1'}
<class 'dict'>
"""