1.文件处理
什么是文件处理:修改存储的信息。
什么是文件:操作系统提供的虚拟概念,存储信息(用二进制存储信息)
操作核心是:读和写。
1.1操作文件的流程:
1.打开文件流程:1.文件路径",2.打开模式(w-->write ,at追加值)",3."字符编码(utf-8,gbk...)
1.2在硬盘中读取数据:
如果我们需要打开一个文件,需要向操作系统发起请求,要求操作系统打开文件,占用操作系统资源。Python中使用open()方法可以打开某个具体的文件,open()方法内写入文件路径。
open(r'D:上海python12期视频python12期视频day 09 est.py','w',encoding='utf8') # encoding指定写入的编码格式
打开文件:
f = open(r'F:python12期上海上课内容day09 est.py','w',encoding='utf8') #创建了一个文件。
# encoding指定写入的编码格式
打开文件之后,文件不仅占用了内存,他还对应了操作系统打开的以文件,相当于使用文本编辑器打开了一个文件。并且我们说了我们操控文件只是为了读和写,因此打开文件并不是目的,读和写才是目的,接下来我们尝试如何读写文件。
- r : 文件的读取操作 (只读) 若没有要读取得文件则报错
# read模式打开文件
f = open(r"E:pyrhon7期课上随写题day9 est.py","r",encoding="utf-8")# encoding指定写入的编码格式
data = f.read()
print(data) #打开文件后,给个变量,可以读取其中的值。
# 读取文件内容,向操作系统发起读请求,会被操作系统转成具体的硬盘操作,将内容由硬盘读入内存
data = f.read()
print(data)
# 由于Python的垃圾回收机制只回收引用计数为0的变量,但是打开文件还占用操作系统的资源,所以我们需要回收操作系统的资源资源
# del f 只是回收变量f
f.close() ## 告诉操作系统关闭文件
1.3写入数据
w : 文件的写入操作 没有该文件则创建,每一次写入都会清空文件再写入
(w-->清空写入)
#write 模式打开文件 wt: 只写(w清空文件后写入),不可读
f = open(r"E:pyrhon7期课上随写题day9 est.py","wt",encoding="utf-8")# encoding指定写入的编码格式
f.write("""我爱你亲爱的
姑娘""")
f.flush() # 快速保存,你可以不使用
f.close()# 告诉操作系统关闭文件
f = open(r"E:pyrhon7期课上随写题day9 est.py","r",encoding="utf-8")
data = f.read()
print(data) #我爱你亲爱
#的姑娘
1.4文件的操作流程:
1.打开文件: wt: 只写(w清空文件后写入),不可读
f = open(r'F:python12期上海上课内容day09 est.py','w',encoding='utf8') #创建了一个文件。
# encoding指定写入的编码格式
# 2. 修改/读取文件
f.write('''
我爱你亲爱的
姑娘
''')
# 3. 保存文件
f.flush() # 快速保存,你可以不使用
# 4. 关闭文件: python真的能操控文件?python通过操作系统操作文件
# del f
f.close() # 告诉操作系统关闭文件
2.文件的三种打开模式
2.1文件打开模式之r模式
r: read,只读模式,只能读不能写,文件不存在时报错
读取:r -->read:文件的读取(只读) rt --> read text。
# rt read_text 读文本内容 只读
f = open(r"E:pyrhon7期课上随写题day9 est.py","rt",encoding="utf-8")# encoding指定写入的编码格式
# f.write("""我爱你亲爱的
姑娘""")
data = f.read()
print(data) #我爱你亲爱的姑娘 w时:计算字符串的长度:8
print(f.readable()) # 判断是否可读 Ture w时:false
print(f.writable()) # 判断是否可写 False w时:Ture
#####:
# data = f.read() # 读取所有文本内容
# print(data)
2.2文件打开模式之w模式
w:write 只能写,不能读,文件存在的时候回清空文件后再写入内容;文件不存在的时候会创建文件后写入内容。
# 1.文件的写入操作 w wt: 只写(w清空文件后写入),不可读
# (1) 打开文件
f = open("ceshi1.txt",mode="w",encoding="utf-8") #打开冰箱
# encoding指定写入的编码格式
# (2) 写入内容
'''write("字符串")'''
f.write("把大象塞进去") #放进大象
# (3) 关闭文件
f.close() #把冰箱门关上
2.3文件打开模式之a模式
a: 可以追加。文件存在,则在文件的末端写入内容;文件不存在的时候会创建文件后写入内容。
# at # at: 只写入(追加写入)
f = open('liangjing.txt', mode='at', encoding='utf8')
# encoding指定写入的编码格式
print(f"f.readable(): {f.readable()}")
f.write('Owen 真帅呀
') # '
'是换行符
f.write('Owen,Owen, you drop, I drop.')
f.write('Owen 帅的我五体投地')
f.close()
#: f.readable(): False
encoding指定写入的编码格式:
# encoding指定写入的编码格式
f = open(r"E:pyrhon7期课上随写题day9 est.py","at",encoding="utf-8")
f = write("你好")
f = open(r"E:pyrhon7期课上随写题day9 est.py","at",encoding="utf-8")
# print(f.read())
2.4打开文本的两种方法
t --> 文本; b --> 二进制模式: 这两个东西不单独使用,一般与r/w/a联用,不需要encoding
# f = open(r'D:上海python12期视频python12期视频day 09 est.py', 'rb')
# print(f.read())
# b模式一般用于图片/音频/视频的保存
import requests
response = requests.get('http://photocdn.sohu.com/20120708/Img347586981.jpg')
data = response.content # 拿到图片的二进制
# print(data)
# w和a模式可以自动创建文件
f = open(r'D:上海python12期视频python12期视频day 09 est.jpg', 'wb')
3.绝对路劲和相对路径。
绝对路径: 从盘符开始 D:上海python12期视频python12期视频day 09 est.py
相对路径: 执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下
4.with管理网文件上下文。
之前我们使用open()方法操作文件,但是open打开文件后我们还需要手动释放文件对操作系统的占用。但是其实我们可以更方便的打开文件,即Python提供的上下文管理工具——with open()。
with open('34a.txt', 'rt', encoding='utf8') as f:
print(f.read())
with open()方法不仅提供自动释放操作系统占用的方法,并且with open可以使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。
with open('34a.txt', 'rt', encoding='utf8') as f,open('35r.txt', 'wb') as fw:
f.write(f.read())
5.文件的高级应用。
# wt
with open('liangjing.txt', 'wt', encoding='utf-8') as fw:
print(fw.readable()) #False
print(fw.writable()) #Ture
# w+t 可写可读 w+ 和 w 没有任何区别
with open('liangjing.txt', 'w+t', encoding='utf-8') as fw:
print(fw.readable()) #Ture
print(fw.writable()) #Ture
# r+t
with open('liangjing.txt', 'r+t', encoding='utf-8') as fr:
print(fr.readable())
print(fr.writable())
# 可写可读 a+ a模式默认光标在尾部
# with open('liangjing.py','a+',encoding='utf8') as fw:
# print(fw.readable())
# print(fw.writable())
# fw.seek(0,0)
# print(fw.read())
注意
- tell() 返回的是当前光标左侧所有的 字节 数
- seek() 调整指针的位置(里面的参数代表 字节 个数)
- seek(0) 将光标直接移动到文件的 开头
- seek(0,2) 将光标直接移动到文件的 末尾
- read() 读取字符的个数(里面的参数代表 字符 个数)
- 如果打开的模式是b字节流模式,读取的单位是字节;如果正常打开,读取的是字符数
- 怎么能让文件自动关闭?
- with... 打开文件 as... 文件别名
- 函数参数里放字节数的,要注意中文,如果移动的位置不是一个完整的中文,会报错
6.文件的修改:
1.方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
import os
with open('37r.txt') as fr,
open('37r_swap.txt', 'w') as fw:
data = fr.read() # 全部读入内存,如果文件很大,会很卡
data = data.replace('tank', 'tankSB') # 在内存中完成修改
fw.write(data) # 新文件一次性写入原文件内容
# 删除原文件
os.remove('37r.txt')
# 重命名新文件名为原文件名
os.rename('37r_swap.txt', '37r.txt')
print('done...')
2.方法二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件。
import os
with open('37r.txt') as fr,
open('37r_swap.txt', 'w') as fw:
# 循环读取文件内容,逐行修改
for line in fr:
line = line.replace('jason', 'jasonSB')
# 新文件写入原文件修改后内容
fw.write(line)
os.remove('37r.txt')
os.rename('37r_swap.txt', '37r.txt')
print('done...')
7.登陆注册
注册
# count = 0
# while count < 3:
# username_inp = input('请输入你的用户名:')
# pwd_inp = input('请输入你的密码:')
# re_pwd_inp = input('请在此输入你的密码:')
#
# if not pwd_inp == re_pwd_inp:
# print('两次密码输入不一致')
# count += 1
# continue
#
# with open('user_info.txt', 'a', encoding='utf8') as fa:
# fa.write(f'{username_inp}:{pwd_inp}
') # :表示用户名和密码的分割;|用户和用户之间的分割
# fa.flush()
# break
登陆:
username_inp = input('请输入你的用户名:')
pwd_inp = input('请输入你的密码:')
with open('user_info.txt', 'r', encoding='utf8') as fr:
for user_info in fr:
username, pwd = user_info.split(':')
if username.strip() == username_inp and pwd.strip() == pwd_inp: # strip可以去掉两端的换行符
print('登录成功')
break
# else:
# continue # continue一般不写在最后一行
else:
print('登录失败')