文件操作
1. 何为文件
文件是为了存储和组织数据或信息而存在的。在计算机中,文件可以是任何类型的数据,包括文本、图像、音频、视频和代码等,它们被存储在计算机硬盘或其他存储设备上。
文件的存在使得我们可以方便地查看、修改、共享和传输数据或信息,也可以帮助我们更好地管理和组织数据。因此,文件在计算机中是非常重要和必不可少的。
2.基本操作文件
2.1读文件
2.1.1 读文本文件
# 1.打开文件
file_object = open('info.txt', mode='rb')
# 2.读取文件内容,并赋值给data
data = file_object.read()
# 3.关闭文件
file_object.close()
print(data) # b'alex-123\n\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90-123'
text = data.decode("utf-8")
print(text)
1.打开文件
- 路径:
相对路径:‘info.txt’
绝对路径:‘D:\oldboy\day10\info.txt’- 模式
rb,表示读取文件原始的二进制(r, 读 read;b, 二进制 binary;)
示例:
# 1.打开文件
file_object = open('info.txt', mode='rt', encoding='utf-8')
# 2.读取文件内容,并赋值给data
data = file_object.read()
# 3.关闭文件
file_object.close()
print(data)
2.1.2 读非文本文件(如图片等)
# 1.打开文件
file_object = open('info.txt', mode='rt', encoding='utf-8')
# 2.读取文件内容,并赋值给data
file_object = open('a1.png', mode='rb')
data = file_object.read()
file_object.close()
print(data) # \x91\xf6\xf2\x83\x8aQFfv\x8b7\xcc\xed\xc3}\x7fT\x9d{.3.\xf1{\xe8\...
2.1.3 判断文件位置是否存在
Ps:读文件时,文件不存在会报错
Traceback (most recent call last):
File "/Users/wupeiqi/PycharmProjects/luffyCourse/day09/2.读文件.py", line 2, in <module>
file_object = open('infower.txt', mode='rt', encoding='utf-8')
FileNotFoundError: [Errno 2] No such file or directory: 'infower.txt'
所以,在以读方式打开文件时,建议先去判断文件是否存在。
可以用os模块中的exists方法判断文件是否存在
示例
import os
file_path = 'D:\oldboy\day10\info.txt'
# 返回True表示存在,False表示不存在
exists = os.path.exists(file_path)
2.1.4 读文件方法
1. 读所有
f = open('info.txt', mode='r',encoding='utf-8')
data = f.read()
f.close()
2. 读n个字符(字节)
f = open('info.txt', mode='r', encoding='utf-8')
# 读1个字符
data = f.read(1)
f.close()
print(data)
f = open('info.txt', mode='rb')
# 读1个字节
data = f.read(3)
f.close()
print(data, type(data)) # b'\xe6\xad\xa6' <class 'bytes'>
3. 读一行
f = open('info.txt', mode='r', encoding='utf-8')
v1 = f.readline()
print(v1)
v2 = f.readline()
print(v2)
f.close()
4. 读所有行,每行作为列表的一个元素
f = open('info.txt', mode='rb')
data_list = f.readlines()
f.close()
print(data_list)
5.判断句柄是否可读
f = open('info.txt', mode='ab')
print(f.readable())
2.2 写文件
2.2.1 写文本文件
写字节类型
# 1.打开文件
# 路径:t1.txt
# 模式:wb(要求写入的内容需要是字节类型)
file_object = open("t1.txt", mode='wb')
# 2.写入内容
file_object.write("hello".encode("utf-8"))
# 3.文件关闭
file_object.close()
写普通文本
file_object = open("t1.txt", mode='wt', encoding='utf-8')
file_object.write("武沛齐")
file_object.close()
2.2.2 写图片等文件
f1 = open('a1.png',mode='rb')
content = f1.read()
f1.close()
f2 = open('a2.png',mode='wb')
f2.write(content)
f2.close()
2.2.3 写文件方法
1. 普通写
f = open('info.txt', mode='ab')
f.write( "武沛齐".encode("utf-8") )
f.close()
2.将列表写入
f = open("b.txt", "w", encoding="utf-8")
data_list = ["123", "234", "345"]
f.writelines(data_list) # 123234345
f.close()
若想将列表每一项写入需换单独行需自行换行
3.将内容从内存中写入硬盘
f = open('info.txt', mode='a',encoding='utf-8')
while True:
# 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
f.write("abcdef")
f.flush()
f.close()
4.判断文件句柄是否可写
f = open('info.txt', mode='ab')
print(f.readable())
3. 文件打开模式
基本文件操作实现了读、写的功能,其中涉及的文件操作模式:rt、rb、wt、wb,其实在文件操作中还有其他的很多模式。
符号 | 含义 |
---|---|
‘r’ | 读文件(默认,不存在报错) |
‘w’ | 写文件(没有创建,有则清空) |
‘x’ | 创建新文件并写文件 |
‘a’ | 有则末尾追加,没有先创建 |
‘b’ | 二进制模式 |
‘t’ | 文本操作(默认) |
‘+’ | 打开文件进行更新 (读和写) |
关于文件的打开模式常见应用有:
模式 | 字符 | 文件和光标 |
---|---|---|
只读 | r 、rt 、rb | 存在,读;不存在,报错 |
只写 | w 、wt 、wb | 存在,清空再写;不存在,创建再写 |
只写 | x 、xt 、xb | 存在,报错;不存在,创建再写。 |
只写 | a 、at 、ab 【尾部追加】 | 存在,尾部追加;不存在,创建再写。 |
读写 | r+、rt+、rb+ | 默认光标位置:起始位置 |
读写 | w+、wt+、wb+ | 默认光标位置:起始位置(清空文件) |
读写 | x+、xt+、xb+ | 默认光标位置:起始位置(新文件) |
读写 | a+、at+、ab+ | 默认光标位置:末尾 |
4. with上下文管理
之前对文件进行操作时,每次都要打开和关闭文件,比较繁琐且容易忘记关闭文件。
使用with上下文管理,它可以自动实现关闭文件。
with open("xxxx.txt", mode='rb') as file_object:
data = file_object.read()
print(data)
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
pass
5.文件指针
5.1 指针移动
指针移动格式如下:
fileObject.seek(offset[, whence])
参数
offset – 开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
PS:seek方法只移动只能以字节为单位。1模式和2模式只能以二进制方式打开。
在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。
5.2 获取光标当前位置
f = open('info.txt', mode='r', encoding='utf-8')
p1 = f.tell()
print(p1) # 0
f.read(3) # 读3个字符 3*3=9字节
p2 = f.tell()
print(p2) # 9
f.close()
f = open('info.txt', mode='rb')
p1 = f.tell()
print(p1) # 0
f.read(3) # 读3个字节
p2 = f.tell()
print(p2) # 3
f.close()
5.3 文件修改
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os
with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('SB','kevin'))
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os
with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('SB','kevin'))
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')