读写文件是最常见的IO操作。
在磁盘上读写文件的功能都是由操作系统提供的,而现代操作系统不允许普通的程序直接操作磁盘。所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)
在操作系统中,文件被表示为文件对象(file object)。每个文件对象都有一个唯一的标识符,称为文件句柄(file handle)。程序通过打开文件来获取文件句柄,然后使用该句柄进行后续的读写操作。
当程序请求操作系统打开一个文件时,操作系统会执行以下步骤:
- 检查文件是否存在:操作系统会检查请求的文件是否存在于磁盘上。如果文件不存在,则返回错误。
- 分配文件句柄:如果文件存在,操作系统会为该文件分配一个唯一的文件句柄。文件句柄是一个抽象的标识符,用于代表打开的文件。
- 返回文件句柄:操作系统将分配的文件句柄返回给程序。程序可以使用该句柄来访问和操作文件。
总之,现代操作系统通过提供文件对象和文件句柄的抽象模型来管理对磁盘的读写操作,这有助于保护系统的安全和稳定性,同时也为程序员提供了一种方便的方式来处理文件的读写操作
open()
open()
函数用于打开(新建)一个文件,并返回一个文件对象
open(file, mode = 'r' , buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file参数:要操作的文件名称(当文件不在当前文件夹或子文件夹中,建议用绝对路径)
mode参数:对文件的处理方式
encoding参数:默认文本文件中字符的编写格式为gbk
r | 读模式(默认模式,可省略),如果文件不存在,抛出异常 |
w | 写模式,如果文件已存在,先清空原有内容,如果不存在,创建新文件 |
x | 写模式,创建新文件,如果文件已存在,则抛出异常 |
a | 追加模式,不覆盖文件中原有内容 |
b | 二进制模式(可与r、w、x或a模式组合使用,如:对图片的读写),打开文件时不允许指定参数encoding |
t | 文本模式(默认模式,可省略) |
+ | 读、写模式(可与其他模式组合使用) |
# 'a' 模式表示追加,如果文件不存在,将创建一个新文件
with open('example.txt', 'a') as file:
file.write('Hello again!')
with open('example.txt', 'r') as file:
content = file.read()
print(content)#Hello again!
with open('example1.txt', 'x') as file:
file.write("Hello again!")
了解:
- 衍生模式:'rb'是二进制文件只读模式、'wb'是二进制只写模式
- 'r'、'w'、'x'以及衍生模式打开文件时文件指针位于文件头,而'a'、'ab'、‘a+’模式打开文件时文件指针位于文件尾
- 注意:同时读写,不是用'rw'模式,而是用'r+'、'w+'或'a+'的组合方式('r+'模式要求文件已存在)
- encoding参数:指定对文本进行编码和解码的方式,只适用于文本模式,如:GBK、UTF8
文件对象常用方法
close() | 把缓冲区的内容写入文件,同时关闭文件,释放文件对象 |
read([size]) | 从文本文件中 / 二讲制文件中读取并返回size个字符 / 字节,省略size参数表示读取文件中全部内容 |
readline() | 从文本文件中读取并返回一行内容 |
readlines() | 返回包含文本文件中每行内容的列表 |
注意:read()、readline()、write()方法读写文件时,表示当前位置的文件指针会自动向后移动,并且每次都是从头开始读写
example1.txt内容:
Hello again1!
with open('example1.txt', 'r') as file:
print(file.read(3))#Hel
seek(cookie,whence=0,/) | 定位文件指针,把文件指针移动到相对于 whence的偏移量为cookie的位置。其中 whence为0表示文件头,1表示当前位置,2表示文件尾。对于文本文件,whence=2 时cookie必须为0;对于二进制文件,whence=2时 cookie可以为负数;不指定时,默认为0 |
with open('example1.txt', 'r') as file:
file.seek(3)#把光标从头移动三位
print(file.read(3))#lo
#读取到了三个字符,有个空格!!!
write(s) | 把s的内容写入文件,如果写入文本文件则s应为字符串;如果写入二进制文件则s应为字节串 |
writelines(s) | 把列表s中的所有字符串写入文本文件,但并不在s中每个字符串后面自动增加换行符。也就是说,如果想让s中的每个字符串写入文本文件时各占一行,应自己编写每个字符串以换行符结束 |
tell()方法
请注意,tell()
返回的是字节位置,而不是字符位置。
example1.txt内容:
Hello again1!
with open('example1.txt', 'r') as file:
a = file.readlines()
print(file.tell())#15
上下文管理语句with
1、with功能
(1)文件打开失败时,会自动关闭资源
(2)可以自动管理资源,无论什么原因跳出with块,总能保证文件被正确关闭
(3)还可以用于数据库连接、网络连接或类似场合
JSON文件操作
是load还是loads,是jump还是jumps?
json.dumps()函数是将字典转化为字符串
import json
dict1 = {"age": "12"}
json_info = json.dumps(dict1) #json_info此时就被转换成一个字符串了
json.loads()函数是将字符串转化为字典
json_info = '{"age": "12"}'
dict1 = json.loads(json_info) #dict1由字符串被转换为一个字典
json.dump()函数的使用,将json信息写进文件
import json
json_msg = {"install": {"install_date": "2018/09/26","install_result": "success"}}
file = open('1.json', 'w')
json.dump(json_msg, file)
json.load()函数的使用,将读取json信息
file = open('1.json','r',encoding='utf-8')
info = json.load(file)
with open('1.json', 'r') as f:
data = json.load(f)