文件操作
冯诺依曼体系架构
-
运算器:用于完成各种算术运算、逻辑运算和数据传送等数据加工处理。
-
控制器:用于控制程序的执行,是计算机的大脑。
-
运算器和控制器组成计算机的中央处理器(CPU)。控制器根据存放在存储器中的指令序列(程序)进行工作,并由一个程序计数器控制指令的执行。控制器具有判断能力,能根据计算结果选择不同的工作流程。
-
存储器:用于记忆程序和数据,例如:内存。程序和数据以二进制代码形式不加区别地存放在存储器中,存放位置由地址确定。
-
输入设备:用于将数据或程序输入到计算机中,例如:鼠标、键盘。
-
输出设备:将数据或程序的处理结果展示给用户,例如:显示器、打印机。
一般的IO操作,指的是磁盘的I/O
Input / Output
文件IO常用操作
函数/方法 | 功能 |
---|---|
open(file_path,mode=“r”,encoding=“gbk”) | 打开文件 |
read(n) | 读取 |
write(string) | 写入 |
close() | 关闭文件 |
readline() | 单行读取 |
readlines() | 多行读取 |
writelines(list) | 写入多行 |
seek(0,2) | 文件光标操作 |
tell() | 光标位置 |
打开文件
open(file_path,mode=‘r’,encoding=None)
f = open("test") # file_object
print(f.read())
f.close()
- 文件的访问有两种模式
- 文本模式和二进制模式。
- 不同模式下,操作函数的结果是不相同的。
打开模式
描述字符 | 意义 |
---|---|
r | 默认模式,表示只读打开 |
w | 只写打开 |
x | 创建并写入一个新的文件 |
a | 写入模式,如果文件存在,则追加 |
b | 二进制模式 |
t | 默认文本模式 |
+ | 读写打开一个文件(增强r a w) |
- r是只读
- wxa都是只写,都可以产生新的文件
- 文本模式t:字符流,有编码按照字符串处理。
- 二进制模式b:将文本按照字节理解,与字符编码无关,二进制操作时,字符使用bytes类型
f = open("test2","wb")
s = f.write("人通教育".encode())
print(s)
print(type(s))
f.close()
f = open("test2","rb")
s = f.read()
print(type(s))
print(s)
f.close()
文件光标(指针)
- 光标指向字节的位置
mode = “r”,指针起始在0
mode = “a”,指针位置在EOF(末尾)
tall() 显示指针的当前位置
seek(offset[,whence]) 跳转到某个位置
seek(0) --> 文件开头
seek(10) --> 开头数第10个字节位置
- whence 0 默认值,表示从头开始,offset只能正整数
- whence 1 表示从当前位置开始,offset只接受0 seek(0,1)
- whence 2 表示从文件结尾开始 seek(0,2) 从结尾开始
encoding:编码,仅文本模式使用
None表示使用默认编码
- windows默认使用GBK (cp936)
- linux下默认使用UTF-8
其他参数
- errors :什么样的编码错误将被捕获
- None和strict表示编码错误将抛出ValueError异常;
- ignore表示忽略
- newline:文本模式中,换行的转换
- None 表示’\n’ ‘\r’ ‘\r\n’ 都可以换行
- \r
- \n
- \r\n
- closefd:关闭文件描述符,True表示关闭它。
其他
seekable() 是否可seek
readable() 是否可读
wirtable() 是否可写
colsed() 是否关闭
上下文管理
# 文件是不能无限打开的
lis = []
for i in range(10000):
lis.append(open("test"))
print(len(lis))
上下文管理:一种特殊的语法,交给解释器去关闭文件、释放资源、断开网络连接.
with open("test") as f:
print(f.read())
StringIO
- io模块中的类
- from io import StringIO
- 内存中,开辟的一个文本模式的buffer(缓冲区),可以向对文件操作一样操作它
- 当close方法被调用时,这个buffer会被释放
from io import StringIO
# 向操作文件一样操作内存
sio = StringIO()
sio.write("123")
print(sio.getvalue()) # 无视指针输出所有内容
sio.close()
- 好处
- 一般来说,磁盘的操作比内存操作要慢的多,内存足够的情况下,使用磁盘IO可以大大提高程序的运行效率。
BytesIO
- io 模块中的类
- from io import BytesIO
- 内存中,开辟一个二进制的buffer,可以向文件一样操作它
- 当close方法被调用的时候,这个buffer会被释放。
- 使用方法同StringIO一样
内存足够的情况下,使用磁盘IO可以大大提高程序的运行效率。
BytesIO
- io 模块中的类
- from io import BytesIO
- 内存中,开辟一个二进制的buffer,可以向文件一样操作它
- 当close方法被调用的时候,这个buffer会被释放。
- 使用方法同StringIO一样