文件处理以及基本使用
- 文件的基本使用
1. 我们能够操作那些类型文件:
.txt 没有后缀的文件
我们暂时不能操作 word, Excel,PPT等文件 numpy,pandas等模块可以操作
2. 如何操作文件
三个步骤
1. 打开文件()
2. 读或者写
3. 关闭文件
文件的路径分为两种:一种是 相对路径,一种是绝对路径
'D:\Python27\day10\a.txt' (绝对路径)
当前文件下 a.txt (相对路径)
# open('要操作文件的路径','读写模式','字符编码(utf-8)')
# 当路径中出现了字母和斜杠的组合会产生一些特殊的含义,所以我们应该去掉 文件路径开头加上 r
步骤1:
f= open(r'D:\Python27\day10\a.txt', 'r', encoding='utf-8')
# 打开文件后 返回的是文件的句柄
步骤2:
print(f) # <_io.TextIOWrapper name='D:\\Python27\\day10\\a.txt' mode='r' encoding='utf-8'>
print(f.read()) # 类似于文件的内置方法
步骤3:
f.close() # 关闭文件
3. 第二种方法打开文件就比较简单了
1. with上下文管理打开文件!
2. as 起别名
3. 特点在于能够 自动关闭文件。
with open(r'a.txt','r',encoding='utf-8') as f:
print(f.read())
- 文件的读写模式(只读,只写,只追加)
"""
语法格式:
open(文件路径,读写模式,字符编码)
文件路径:是必须写的
读写模式:也是必须写的
字符编码:可选的
"""读写模式: r(只读:只能读,不能写)
w (只写:不能读)
a(在原来的基础之上添加新的内容)
1. 只读模式 # 当文件不存在的时候 直接报错
with open('a.txt','r',encoding='utf-8') as f:
print(f.read())
2. 只写模式 # 当文件不存在的时候 会自动创建出来 如果有文件 里面有内容会被后面写进去的内容直接覆盖
with open('a,txt','r',encoding='utf-8') as f:
prinr(f.write)
3. 追加模式:# 当文件不存在的时候 会自动创建出来 记住:它是追加写,而不是覆盖原来的内容!
with open('c.txt', 'a', encoding='utf-8') as f:
f.write('hello world')
- 文件读写操作的相关内置方法
1. 读系列 相关方法
with open('a.txt','r',encoding='utf-8') as f:
print(f.read()) # read 方法是一次性读完全部内容 弊端:如果文件内容过大 会顶爆内存
prinr(f.readline()) # readlline方法 一次只读文件的一行内容
print(f.readlines()) # readlints 一次性一行一行读完文件的所有内容,然后每一个内容作为列表的一个元素返回,返回的数据类型是 列表
print(readable()) # 判断文件是否可读 返回True或者 Fales
2. 写系列with open('a.txt','w',encoding='utf-8') as f:
print(f.write('写进去的文件内容')) # 写进去的文件内容 会覆盖前面的旧内容
print(f.writeable()) # 判断是否可写 - 读取文件的优先操作
with open('a.txt', 'r', encoding='utf-8') as f:
# print(f.read()) # 一次性读取文件的所有数据,并且光标在文件的末尾,如果在去读,就读不到了
# print(f.read())
# 文件句柄f是支持for循环的
for line in f:
# line: 就是文件的一行内容
print(line)
# 了解的方法:
# f.flush() # 把数据从内存中立刻刷到磁盘
""" - 文件的操作模式
1. 文本模式:
"""
with open('userinfo.txt', 'r', encoding='utf-8') as f:
文本模式默认就是操作字符串,文本
特征:
1. encoding参数必须指定
2. 读取的所有的数据都是以字符串为单位的
3. t模式只能够读取文本或者字符模式
"""2. 二进制模式:
b模式:binary
with open('userinfo.txt', 'rb') as f:
"""
b模式中得b不能省略------------> rb wb ab
特征:
1. encoding='utf-8'参数不能够指定
2. 读取的数据全部以字节为单位
3. 二进制模式可以读取任意类型的文件
""" - 练习题
用户注册与登录功能
while True:
print(
'1,注册功能'
'2,登录功能'
)
cmd = input('请选择功能>>>:').strip()
if cmd =='1':
username = input('请输入账户>>>').strip()
password = input('请输入密码>>>').strip()
# 2 读取文件判断用户是否已经注册
with open('a.txt','r',encoding='utf-8') as f:
res = f.read().split(',')[0]
for line in res:
# 3. 进行字符分割
# print(res)
# 4 判断用户是否已经注册
if username in res:
print('该用户已经注册,请重新输入')
break
# 5 如果用户没有注册 则保存文件 注册成功
else:
data = '%s,%s\n' % (username,password)
with open('a.txt','a',encoding='utf-8') as f:
f.write(data)
print('注册成功')
if cmd == '2':
username = input('请输入账号>>>:').strip()
password = input('请输入密码>>>:').strip()
with open('a.txt', 'r', encoding='utf-8') as f:
# read readline
# 循环逐行读取用户名和密码
for line in f:
# line : jerry|123
real_username, real_password = line.split(',') # ['jerry', '123\n']
# print(real_username, real_password)
# 比较用户名和密码
if real_username == username and password == real_password.strip('\n'):
print('登录成功')
break
else:
print('用户名或者密码不正确')简单的拷贝功能
# 简易版本的拷贝功能 # 请输入需要拷贝的地址 while True: cp_name = input("输入拷贝后的地址>>>").strip() with open(cp_name,'r',encoding='utf-8') as f: data = f.read() # 输入需要拷贝后的地址 cp_time = input("输入拷贝后的地址>>>").strip() with open(cp_time,'w',encoding='utf-8') as f1: f1.write(data) print('拷贝完成')
7. 二进制模式下的读写操作
默认情况下是t模式: with open('a.txt', 'r', encoding='utf-8') as f: print(f.read(5)) """ t模式下: f.read() 如果不指定参数,默认情况下是一次性读取完所有 f.read(5) 如果指定了参数,返回的就是字符串的个数 """ with open('a.txt', 'rb') as f: # print(f.read().decode('utf-8')) # b'helloworld' print(f.read(7).decode('utf-8')) # b'helloworld' """ b模式下: f.read(5) 如果指定了参数,返回的就是字节的个数 如果文件中有中文字符,切记书写的数字要是3的倍数(因为一个中文字符是3个字节)如果有中文和英文 那就需要计算了 """
8. 控制文件光标的移动
一共有三种模式: 1. 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的: 它能够使用在t和b模式 2. 该模式代表指针移动的字节数是以当前所在的位置为参照的: 只支持b模式,t模式不行 3. 该模式代表指针移动的字节数是以文件末尾的位置为参照的 f.seek() 4. 在问本模式下 移动的是字符的个数 在二进制模式下 移动的是字节的个数! with open('a.txt', 'r', encoding='utf-8') as f: print(f.read(5)) # 你helloworld f.seek(3, 1) print(f.read()) # 代表 从中间开始 在向右移动 3 个字符 with open('a.txt', 'rb') as f: print(f.read(2)) # helloworld f.seek(-3, 2) print(f.read()) 代表的是移动的偏移量 如果是正数,就往右边移 如果是负数,就往左边以----------》左边要可移动 如果开头就向左移动 在左边没有字符或字节的情况下会报错的
小练习 实现动态查看最新一条消息的结果
import time with open('access.log', mode='rb') as f: f.seek(0, 2) while True: line = f.readline() if len(line) == 0: # 没有内容 time.sleep(0.5) # 睡眠0.5秒 else: print(line.decode('utf-8'), end='')
9. 修改文件
mode='r+' mode='w+t' mode='a+t' # 可读可写 # 可读可写 # 可读可写 1. 硬盘中得数据是不允许直接修改的 2. 内存中得数据是可以直接修改的 '''方式一:''' # 1. 读取文件内的所有数据 # 快捷键:shift+enter with open('a.txt', 'r', encoding='utf-8') as f: data = f.read() print(data) # 2. 读取完字符之后,做字符替换 with open('a.txt', 'wt', encoding='utf-8') as f: f.write(data.replace('kevin', 'kevinSB')) '''方式2:''' import os with open('a.txt',mode='rt',encoding='utf-8') as read_f, \ open('.a.txt.swap',mode='wt',encoding='utf-8') as wrife_f: for line in read_f: wrife_f.write(line.replace('SB','kevin')) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人