python文件

IO在计算机编程中指的是输入和输出。IO编程中,Stream(流)是一个很重要的概念。IO有同步IO和异步IO两种,同步和异步的区别就在于是否等待IO执行的结果。读写文件是常见的IO操作。

1. 文件

1.1 打开文件

open():打开文件,返回一个stream(流对象)

使用方法:open(file, mode='r', buffering=None, encoding=None, errors=None...............)

  • file:文本文件、二进制字符串、文件路径(使用相对路径或绝对路径表示)
  • mode:打开文件的模式
    • r:读模式打开(默认)
    • w:写入模式打开,先清空文件,不存在则创建文件
    • x:创建新文件,以写入模式打开
    • a:以追加写入模式打开,不存在则创建文件
    • b:二进制模式打开
    • t:文本模式(默认)
    • +:读写模式打开
  • encoding:打开文件使用的编码(与写入文件使用的编码相同才能正常读取)
1.2 关闭文件
  • close():close()方法用来关闭文件
  • 建议完成操作后总是关闭文件,打开的文件会占用系统资源
file = open("test.txt")
# 操作
file.close()  # 关闭文件
  • try----finally方式:
try:
  file = open("test.txt")
    # 操作
finally:
  file.close()
  • with-----open-----as-------方式:推荐使用,会自动调用close()方法关闭文件
with open("test.txt") as f:
  # 操作
1.3 读取文件
  • read():一次读取所有内容并返回,适用于文件较小时使用
  • read(size):读取一定数量数据并返回。文本模式下(rt),表示读取指定字符数;二进制模式下(rb),表示读取指定字节数。UTF8编码下,英文字符一个字节,汉字三个字节
  • readline():读取一行并返回
  • readlines():读取所有行并以列表形式返回(包括换行符)
# 读取文件
# read():读取所有并返回,一般用于文件较小时读取
with open("python.txt", "r") as file:
    content = file.read()
    print(content)
# read(size):文本模式下读取指定字符数返回;二进制模式下表示读取指定字节返回(utf8编码,英文1个字节,汉字3个字节)
with open("python.txt", "r") as file:
    content = file.read(20)
    print(content)
    
with open("python.txt", "rb") as file:
    content = file.read(20)
    print(content)
    
# readline():读取一行并返回
with open("python.txt", "r") as file:
    line = file.readline()
    print(line)
    
# readlines():读取所有行包括换行符并以列表形式返回
with open("python.txt", "r") as file:
    line_list = file.readlines()
    print(line_list)
    
1.4 写入文件
  • write():写入字符串到文件,并返回写入的字符串数量(二进制模式返回写入的字节数)
# 写入文件:以写入模式(w,a,x,t,b)打开,使用write()方法进行写入,返回添加的字符数(二进制模式返回添加的字节数)
with open("python.txt", "a") as file:
    add_num = file.write("这是我自己添加的一行!!!")
    print(add_num)
    
with open("python.txt", "ab") as file:
    add_num = file.write("这是我自己添加的一行!!!".encode("utf-8"))
    print(add_num)
1.5 文件指针
  • tell():返回当前文件指针所在位置(字节数)
  • seek():修改文件指针位置(通过字节偏移量)
  • seek(self, offset: int, whence: int = 0)
    • offset:字节偏移量
    • whence:相对位置(默认为文件开始位置)0 文件开头 1 当前位置 2 文件末尾
with open("python.txt", "r") as file:
    print(file.tell())  # 起始指针位置
    file.read(20)  # 读取20个字符
    print(file.tell())  # 读取指定字符后指针位置(字节数)
    file.seek(0)  # 移动指针到指定位置(此处为文件开头)
    print(file.tell())  # 手动移动指针后指针位置
1.6 文件迭代
  • 基本概念:

    • 循环:满足条件的情况下,重复执行某段代码
    • 迭代:按照某种顺序访问线性结构中的每一项
    • 遍历:按一定规则访问非线性结构的每一项
    • 递归:一个函数不断调用自身的行为
  • 判断一个对象能否迭代

    from collections import Iterable
    isinstance(obj, Iterable)
    
  • iter():生成一个迭代器,使用next()函数不断获取下一个值

  • 按行迭代:

    # 文件迭代:按行迭代
    with open("python.txt", "r") as file:
        while True:
            line = file.readline()
            print(line)
            if not line:
                break
    
    with open("python.txt", "r") as file:
        for line in file:
            print(line)
    

2. StringIO和BytesIO

2.1 StringIO:在内存中读写str
from io import StringIO

file = StringIO("hello\n world \n name.")  # 创建StringIO对象并使用字符串进行初始化
print(file.read())  # 读取StringIO对象的内容

file.write("hello python")
print(file.getvalue())  # 获取StringIO对象写入后的内容
2.2 BytesIO:读写二进制数据
from io import BytesIO

file = BytesIO("你好".encode("utf-8"))  # 创建并初始化BytesIO对象
print(file.read().decode("utf-8"))  # 读取内容并解码

file.write("中国".encode("utf-8"))  # 向BytesIO对象写入内容(二进制,需要编码)
print(file.getvalue().decode("utf-8"))  # 获取写入后的内容并解码

3. 序列化与反序列化

把对象的状态信息变成可存储或传输的过程称之为序列化(二进制格式)。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。python使用pickle模块实现数据的简单序列化和反序列化。

3.1 序列化
  • pickle.dumps(obj):将对象序列化为bytes(此时可用wb格式打开文件并写入)
  • pickle.dump(obj, file):直接序列化并写入文件
# 序列化与反序列化
import pickle

# 序列化:将对象状态信息变为可存储或者可传输的过程称为序列化(变为二进制格式)
mydict = {"name":"fengdi", "age":22, "language":"python"}
mydict_pickle = pickle.dumps(mydict)  # 序列化为二进制模式,此时可写入文件或进行传输
print(mydict_pickle)

with open("pickle.txt", "wb") as file:  # 以二进制写入模式打开并写入
    file.write(mydict_pickle)
    
with open("pickle.txt", "rb") as file:
    content = file.read()
    print(content)

mylist = ["python", "java", 10, 20]  # 直接序列化对象并写入文件
with open("pickle.txt", "wb") as file:
    pickle.dump(mylist, file)
    
with open("pickle.txt", "rb") as file:
    content = file.read()
    print(content)
3.2 反序列化
  • pickle.loads(obj):反序列化bytes文件(应先从文件中读取出来)
  • pickle.load(file):直接从文件中读取bytes并反序列化
# 反序列化
with open("pickle.txt", "rb") as file:
    content = file.read()  # 二进制模式
    print(pickle.loads(content)) # 从二进制模式反序列化(需要先以二进制模式将内容读取出来)
    
with open("pickle.txt", "rb") as file:  # 直接从文件中反序列化为对象
    content = pickle.load(file)
    print(content)

4. python和json格式转换

  • json格式是标准格式,与python类型的对应关系:
python类型 json类型
dict { }
list [ ]
str " "
int float 1234.56
True False true false
None null
  • 转换方法和序列化反序列化类似:
    • json.dumps(obj):将python对象转换为json对象
    • json.dump(obj, file):将python对象转换为json对象并写入文件
    • json.loads(obj):将json对象转换为python对象 (应先从文件中读取出来)
    • json.load(file):直接从文件中读取并转换为python类型