美文网首页python复习100天
python复习第8天:文件读写

python复习第8天:文件读写

作者: 潮办公 | 来源:发表于2020-03-20 23:32 被阅读0次

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'>
"""

相关文章

网友评论

    本文标题:python复习第8天:文件读写

    本文链接:https://www.haomeiwen.com/subject/wjleyhtx.html