文件处理
文件的处理
目录
一 、文件操作简介
- 1.文件操作的含义
- 2.使用代码操作文件的基本流程
- 3.注意事项
二 、文件的读写模式
- 1.只读模式(r)
- 2.只写模式(w)
- 3.只追加模式(a)
- 4.+模式
三 、 文件的操作模式
- 1.文本模式(t)
- 2.二进制模式(b)
- 3.文本模式与二进制模式的比较
四 、 文件的诸多操作方法
- 1.读操作
- 2.写操作
- 3.其他操作
五 、 文件内指针的移动
- 在文件内指针移动的前提
- 实现指针在文件中移动的操作
六 、 文件数据的修改
- 1.机械硬盘存储数据的原理
- 2.文件数据修改———覆盖写
- 3.文件数据修改———重命名
文件操作简介
-
文件操作的含义
通过编写代码的方式自动操作对文件的读写 -
使用代码操作文件的基本流程
1.打开文件,向操作系统发起调用open(...)指令,操作系统打开该文件所对应的硬盘空间,将一个文件对象赋值给一个变量
f = open('所需打开的文本' , ‘r' , encoding = 'utf-8') # 默认打开模式为 r2.调用文件对象下的读/写方式,操作系统将其转换为读/写硬盘的操作
info = f.read( )
3.对操作系统发出关闭文件的请求,回收系统资源
f.close( ) -
注意事项
由于使用 f = open( ) 后必须要使用f.close( )来回收系统资源。而人们经常在打开文件后对文件不管不顾,从而使文件一直处于打开的状态,造成占用资源。
因此,python诞生了with用法,使用with方法打开文件后自动关闭文件,也可同时打开多个文件(用逗号隔开就行)避免了资源的浪费。
同时打开多个文件的操作:
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data = read_f.read()
write_f.write(data)
针对文本文件时,可能存在特殊含义,在其字符串前面加 字母 r 即可取消特殊含义
文件的读写模式
- 只读模式( r )
在此模式下打开文件只能读取内容,不能做其他操作
1. 若是文本路径存在,则会打开文件等待读取文件内容
with open(r'a.txt', 'r', encoding='utf8') as f:
# print(f.read()
f.write('123')
2. 若是文本路径不存在,则会报错
with open (r'b.txt', 'r', encoding = 'utf-8') as f :
pass # 补全python语法
- 只写模式( w )
在此模式下打开文件只能写入内容,不能做其他操作
只写模式(w)在文件不存在时会创建新的文件,文件存在会做清空处理,然后再等待写入文件的内容
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('111\n222\n333\n')
f.write('德玛西亚')
在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
文件关闭,重新打开则会清空文件内容
- 只追加模式( a )
只追加模式( a ) 在文件不存在时会创建空文档,文件存在会在文件信息的末尾添加待写入的内容
with open(r'b.txt', 'a', encoding='utf8') as f:
f.write('干饭人,干饭魂,干饭都是人上人\n')
- +模式
r+ w + a + : 可读可写
常见的情况下,只单纯使用r/w/a,一般不用可读可写模式
控制文件的操作模式
文件的操作模式 即控制文件读写内容的模式,有 t 模式和 b 模式。这两种模式不能单独使用,必须与r/w/a之一相结合使用
- 文本模式 ( t )
- 只能操作文本文件
- 必须指定encoding参数
- 读写都是以字符为单位的
- 二进制模式( b )
- 能够操作所有类型的文件
- 不需要指定参数
- 读写都是字字节为单位
- 文本模式与二进制模式的比较
- 在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码
- 针对非文本文件(如图片、视频、音频等)只能使用b模式
文件的操作方法
- 读操作
read() 一次性读取所有内容,执行完该操作后,文件指针会移动到文件末尾,继续读则为空
readline() 只读取一行内容
readlines() 读取每一行内容,存放于列表中
readable() 判断当前文件是否可读
- 写操作
write() 填写文件内容
writelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
writable() 判断当前文件是否可写
- 其他操作
closed 文件是否关闭
encoding 如果文件打开模式为b,则没有该属性
flush() 立刻将文件内容从内存保存到硬盘
文件内指针的移动
-
在文件内指针移动的前提
文件内指针的移动基本上都是以字节(bytes)为单位的,只有在t模式下的read(n)中的 n 是以字符为单位的 -
实现指针在文件中移动的操作
文件的指针的移动都是由读/写操作触发,当要读取文件中的某一特定数据时,需要采用f.seek方法主动控制文件内指针的移动使用 tell ( ) 方法可获取光标移动的字节数
seek(offset,whence)
offset 控制光标移动的位移量(字节)
whence 模式
0 从文件开头开始移动,移动了几个个字节
1 从文件当中指针所表示的位置开始技术,前面移动了多少,就是移动了多少字节
2 直接跳到文件末尾,从文件末尾开始看移动多少字节(为负则为往前移动的字节数)
文件数据的修改
- 机械硬盘存储数据的原理
- 数据的修改 其实是覆盖写
- 数据的删除 占有态自由态
- 文件数据修改———覆盖写
先读取文件内容到内存 在内存中完成修改 之后w模式打开该文件写入
with open(r'demo.txt','r',encoding='utf8') as f:
data = f.read()
new_data = data.replace('DSB','NB')
with open(r'demo.txt','w',encoding='utf8') as f1:
f1.write(new_data)
优点:硬盘只占用一块空间
缺点:数据量较大的时候会造成内存溢出
- 文件数据修改———重命名
先读取文件内容到内存 在内存中完成修改 之后保存到另外一个文件中
再将原文件删除 将新的文件重命名为原文件
import os
with open('demo.txt', 'r', encoding='utf8') as read_f, \
open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('NB', 'SB'))
os.remove('demo.txt') # 删除文件
os.rename('.demo.txt.swap', 'demo.txt') # 重命名文件
优点:不会造成内存溢出
缺点:有那么一段时间需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘
作业
- 用函数的形式完成登录/注册程序
f = open(r'userinfo.txt', 'r', encoding='utf8') # 打开存账号的文件
res = f.read() # 读取文件中的内容
user_list = res.split() # 分割字符串,返回列表
info = {} # 定义一个空字典
for i in user_list:
name = i.split(',')[0]
paw = i.split(',')[1]
info[name] = paw # 循环列表,取出列表中的值存入字典
flag = True
def cyclic(): # 创建一个用户登录程序函数
while flag:
print("""
--------------用户登录/注册---------------
1.登录
2.注册
3.退出程序
""")
choice = input('请输入你的选择:').strip()
return choice
def register(name, paw): # 用户注册
with open(r'userinfo.txt', 'a', encoding='utf8') as f: # 查看文件信息
temp = '\n' + name + ',' + paw
f.write(temp) # 按照这个格式写入文件
def login(name, paw): #用户登录
with open(r'userinfo.txt', 'r', encoding='utf8') as f: # 输入追加的信息
register = name + ',' + paw
if register in res:
return True # 登录成功
else:
return False # 登录失败
def contrast(name, paw, paw1): # 判断是否可注册
if paw != paw1:
print('两次密码不一致!')
elif name == '' or paw == '':
print('用户名密码不能为空!')
elif name in info:
print('用户名已存在')
else:
print('恭喜注册成功!')
while flag:
choice = cyclic() # 调用登录程序的相应函数
if choice == '1':
print('-------------请入登录界面----------------')
name = input('请输入你的用户名:').strip()
paw = input('请输入你的密码:').strip()
i = login(name, paw) # 调用登录函数
if i:
print('登录成功')
else:
print('用户名或密码错误')
elif choice == '2':
print('--------------进入注册界面----------------')
name = input('请输入用户名:').strip()
paw = input('请输入密码:').strip()
paw1 = input('请再次输入密码:').strip()
contrast(name,paw, paw1) # 调用对比
register(name, paw) # 进行添加
elif choice == '3':
print('欢迎下次使用')
flag = False
else:
print('请输入正确的指令')


浙公网安备 33010602011771号