读写文件
使用**open()**方法打开一个文件,建立一个程序与文件的数据流。在打开文件的时候需要设置打开的模式,常见的打开模式如下:
打开模式 | 描述 | 文件指针 | 异常 |
---|---|---|---|
r | 只读模式打开,默认 | 开头 | 如果文件不存在,会出现异常 |
r+ | 读写模式打开 | 开头 | 如果文件不存在,会出现异常 |
w | 只写模式打开,打开文件会清空原有内容 | 开头/结尾 | |
w+ | 读写模式打开,打开文件会清空原有内容 | 开头/结尾 | |
a | 只写模式打开 | 结尾 | |
a+ | 读写模式打开 | 结尾 | |
b | 二进制数据流,可以与上述的混合使用 |
1. 读取文件的基本操作
from collections.abc import Iterator, Iterable
# 读取文件中的内容
# 打开指定的文件,设置打开模式为r,表示读取;设置encoding字符集,使用utf8字符集打开文件;获取到一个数据流
read_stream = open("./1. OS模块.py", "r", encoding="utf8")
# 打开文件后,建立数据通道,每一行数据就已经存在于一个迭代器容器中。
print(isinstance(read_stream, Iterator))
print(isinstance(read_stream, Iterable))
# 遍历,获取到文件中的每一行数据
# for line_data in read_stream:
# print(line_data, end="")
# 还可以将文件中的数据当作一个字符串全部读取
# file_data = read_stream.read()
# print(file_data)
# 读取指定数量的字符
# data = read_stream.read(30)
# print(data)
# 读取一行数据
print(read_stream.readline(), end="")
print(read_stream.readline(), end="")
print(read_stream.readline(), end="")
print(read_stream.readline(), end="")
# 读取指定行的数据
# 参数传递的是一个字符的数量,返回的是这些字符所在的行数据!
print(read_stream.readlines(34), end="")
read_stream.close()
2. 循环读取文件
'''
内存是2G
文件内容是4G
内容是迭代器 读出来之后迭代器中就没有了
分批读取 肯定是将读的操作进行重复 重复到什么情况下不用再重复了 [read的内容是空字符串]
分批读取 怎么分批 一般是按照计算单位的换算来走的 通常是1024的倍数
'''
read_stream = open('./os的操作_08.py', 'r', encoding='utf-8')
while True:
data = read_stream.read(1024)
print(data)
if data == '':
break
3. 以字节模式读取
read_stream = open('./os的操作_08.py', 'rb')
# for ele in read_stream:
# print(ele)
# data = read_stream.read(18) # 字节数
# print(data)
# print(data.decode('utf-8'))
print(read_stream.readlines())
read_stream.close()
# import os
# os.remove('./os的操作_08.py')
4. 写模式的基本操作
# 和文件之间建立通道
# w: 写模式
# a: 向后追加,如果没有设置追加模式,则默认会用新的内容覆盖掉之前的内容
write_stream = open("./相思.txt", "w", encoding="utf8")
# 写操作,一次写
write_stream.write("红豆生南国,春来发几支?\n")
# 同时写多个
write_stream.writelines(["愿君多采撷, ", "此物最相思\n"])
write_stream.close()
5. 以字节模式写入
# 和文件之间建立通道
# w: 写模式
# a: 向后追加,如果没有设置追加模式,则默认会用新的内容覆盖掉之前的内容
# b: binary,字节模式
write_stream = open("./相思.txt", "wb")
# 写操作,一次写
write_stream.write("红豆生南国,春来发几支?\n".encode("utf8"))
# 同时写多个
write_stream.writelines(map(lambda ele: ele.encode("utf8"), ["愿君多采撷, ", "此物最相思\n"]))
write_stream.close()
拷贝文件
# 其实拷贝文件的思路非常简单,就是读取源文件,将读取到的内容原封不动的写入到目标文件即可
def copy_file(src_file, dst_file):
"""
拷贝文件
:param src_file: 源文件
:param dst_file: 目标文件
:return:
"""
# 1. 以字节模式打开源文件,创建数据流
read_stream = open(src_file, "rb")
# 2. 以字节模式打开目标文件,创建数据流
write_stream = open(dst_file, "wb")
# 3. 循环读取源文件的内容,往目标文件写
while len(read_data := read_stream.read(1024)) != 0:
write_stream.write(read_data)
write_stream.flush()
copy_file("./1. OS模块.py", "./1. OS模块.py.copy")