文件操作
文件操作
1.文件操作
# 1.1 只读操作
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read()) # 一次性读出文件里所有的内容
print(f.readline()) # 一次只读一行
print(f.readlines()) # 一次读出文件内所有的内容并组成列表的形式,列表里的每个元素代表文件里的每一行内容
print(f.readable()) # 判断文件是否具有可读性,返回True或False
'''
当文件数据很大时,用read直接读取全部内容到内存中,有时候可能会出现内存溢出的情况,
解决办法:1、用readline一行一行的读取
2、for 循环文件从中一次取出一行内容,逐行取出文件里的内容
'''
for line in f: # 文件内容行与行之间默认有一个换行符\n换行符,在循环打印时\n也是存在的
line = line.strip()
print(line)
# 1.2 只写操作
with open(r'a.txt', 'w', encoding='utf8') as f:
# f.write() # 每次写之气先把文件里的内容清空再写入,括号内的参数只能是字符串类型
f.writelines(['jane', 'jenny', 'jason'] ) # 可以将列表中的多个元素同时写入文件中,文件与文件之间是紧贴着的
print(f.writable()) # 判断文件是否是可读的
f.flush() # 将内存里的内容强制刷到硬盘里,相当于CTRL+S,防止重要数据不能及时写入文件中
# 1.3 追加模式
# 关键字:a
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write() # 追加模式下,如果路径不存在,会自动创建,如果有,不会先清除文件内部内容,而是在文件尾部追加
2.文本操作模式
# 2.文本操作模式
# 文本操作模式
1.默认的模式
r w a >>> rt wt at
2.该模式所有操作都是以字符串基本单位(文本)
3.该模式必须要指定encoding参数
4.该模式只能操作文本文件
# 二进制操作模式
1.该模式下可以操作任意类型的文件
2.该模式的所有操作都是以字节类型bytes为基本单位
3.该模式不需要指定encoding参数
r w a >>> rb wb ab(必须写b)
3.文件光标的移动
# 文件内光标的移动
'''
在进行文件操作时,文件内部是有一个类似光标的东西在的,光标的位置决定了在对文件进行读写操作时返回的结果
'''
# 在对文件进行读写操作时,可以利用文件的内置方法进行光标的移动
with open(r'a.txt', 'r', encoding='utf8') as f:
f.write('hello my name is jane')
f.seek()
# seek内部的两个参数:f.seek(offset、whence)
# offset
offset是指光标初始位置,基本单位是字节,正负数代表光标移动的方向
# whence
whence只有三种模式:0,1,2
0是指光标回到文件的初始位置
1是指光标回到当前操作位置
2是指光标回到文件末尾位置
# 且0模式可以在文本模式和二进制模式下都可以使用。1和2只能在二进制模式下使用
# 在不写whence时,whence默认为0
# eg1:文本模式下进行操作光标的移动
with open(r'a.txt', 'r', encoding='utf8') as f:
f.write('hello my name is jane')
f.seek(3,0) # 跳转到文件初始位置的三个字节之后
'''在utf8编码模式下,一个英文字符占用一个字节,一个中文占用3个字节,
因此在文本模式下操作文件进行seek操作时如果是纯中文的情况,
offset只能是3或者3的倍数,否则将会报错'''
# eg2:二进制模式下进行光标移动的操作
with open(r'a.txt', 'rb') as f:
f.seek(1, 1)
f.tell():此外和see连用的还有tell放法,返回当前光标的位置,也是以字节为基本单位
# 在二进制下进行光标移动的操作时,参数offset可以是任意值,因为在二进制下,文件内数据的基本单位是字节
4.文件的修改
# 文件的的修改
# 文件的修改有两种方式
# 方式一:
以r模式打开文件,把文件里的内容读取出来,且把需要替换的内容
通过字符串的替换方法进行替换以后赋值给一个新的变量
随后再次以只写模式打开文件,把刚才赋值好的新变量添加到文件里
# eg1
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read()
print(data)
with open(r'a.txt', 'w', encoding='utf8') as f1:
new_data = data.replace('jane', 'jason')
f1.write(new_data)
# 方式二:
用with语法同时打开两个文件,r模式打开原文件,w模式打开新文件,
通过for循环源文件,把内容一行一行的读出来,随后对每一行内容进行字符串的替换操作
把替换后的内容写到新的文件里
删除源文件,对新文件重命名
# eg2
import os # 需要先导入os模块
with open(r'a.txt', 'r', encoding='utf8') as f, \
open(r'c.txt', 'w', encoding='utf8') as f1:
for line in f:
f1.write(line.replace('jason', 'sb'))
os.remove('a.txt') # 删除原文件
os.rename('c.txt', 'a.txt') # 重命名
'''两种修改文件方法比较
方式一:优势:只需要在源文件的基础上进行操作,不会占用多余的空间
劣势:当文件数量较多时,f.read()会一次性读出文件内所有的文件,可能会出现内存溢出的情况
方式二:优势:由于方式二采用的是for循环逐行读取文件内的内容,所以当文件内容较多时,也不会出现内存溢出的情况
劣势:方式二在进行操作时,要同时打开两个文件,对内存的占用空间较大
'''
5.拷贝文件小工具
# 1.使用二进制操作模式,把文件的内容读出来并解码赋值给一个变量1
# 2.定义一个文件路径通用模板
# 3.通过for循环生成文件路径
# 4.创建一个空的文件,用于存放路径
# 从已生成的文件中读取文件路径并赋值给一个变量2
# 6.在文本模式下,打开文件。把文件路径替换为变量2
# 7.把文件一次性拷贝五个到一个文件夹内
# TODO:同时拷贝五份指定文件
# 1.使用二进制操作模式,把文件的内容读出来并解码赋值给一个变量1
with open(r'E:\python基础知识\python基础day09\视频\03 作业讲解.mp4', 'rb') as f:
# 2.将文件内容读出来赋值给一个变量
data = f.read()
# 3.创建一个新的文件从c.txt,用来存储文件路径
with open(r'c.txt', 'a', encoding='utf8') as f:
i: int
# 3.1.循环打印文件路径
for i in range(5):
# 3.2 定义一个路径通用地址
road = r'E:\python基础知识\新建文件夹\作业讲解%s.mp4' % i
# 3.3 往文件内添加路径地址
f.write('%s\n' % road)
# 4.打开文件从。txt
with open(r'c.txt', 'r', encoding='utf8') as f:
# 4.1 循环从文件中取出每一行的内容
for line in f:
# 4.2 去除文件内每一行尾部的换行符
line = line.strip('\n')
# 4.3 循环创建新的文件,文件路径调用line参数
with open(r'%s' % line, 'wb') as f1:
# 4.5 将之前存好的内容data陆续写入到文件里
f1.write(data)
# TODO:用户输入自己想要拷贝的文件
# 获取用户想要拷贝到的文件
address = input('请输入你要拷贝的文件路径>>>:').strip() # 获取用户想要拷贝的文件路径,并去掉首尾多余的空格
new_address = input('请输入你要拷贝到的文件路径>>>:').strip() # 获取用户输入并去掉首尾多余的空格
# 用二进制模式打开要拷贝的文件
with open(r'%s' % address, 'rb') as f:
# 把文件里的内容赋值给一个变量名copy_list
copy_list = f.read().strip()
# 获取用户想要拷贝到的文件路径
# 用二进制把要copy的文件拷贝到指定的地址
with open(r'%s' % new_address, 'wb') as f1:
f1.write(copy_list)
ps:
这里说一下计算机内部在进行存储数据和删除数据以及恢复数据时的具体的操作过程,可以稍作了解。
你可以把计算机硬盘想象成一个很大的房子,而我们在存储数据时,会有一个类似指针的东西在房间里的卧室1里刻录数据,并且在卧室门上挂上一个房间已有人,请勿打扰的牌子来指明当前卧室1的状态,当我们在存储其他数据时,又会有一个类似指针的东西开始刻录数据,当指针来到卧室1的时候,看到了房间已有人的字样,就知道房间里已有数据,就会把数据存放到其他卧室。
不过有一点是,当我们在清除卧室1里的时,只是把卧室里的数据清除并把卧室门上的’已有人‘换成空房间的状态,但是屋子里的数据并没有完全丢失,而是被放到了地下室,当我们需要找回时,去地下室就能把数据找回,也就是我们常说的数据恢复,当我们再存储新数据时,指针看到卧室1是空房间状态,就会把数据放到卧室1里。
那当我们出现电脑丢了,虽然数据已经删除了,但是还能通过数据恢复找回的情况,且被找回的数据有个人私密信息时应该怎么解决?
其实很简单,回到卧室1数据刚删除时,把数据放到地下室的情况,当我们把卧室1第一次存入的数据放到地下室并再次在卧室1存进去新的数据以后,第一次的数据就好像地下室着火了,把第一次的数据烧没了,当我们把第二次的数据删除放到地下室以后再执行数据恢复的操作时,只能从地下室拿到第二次的数据,第一次的数据已经被烧没了。
而手机内部存储数据删除数据以及数据恢复和计算机一样。