day 09 小结

1.文件处理

什么是文件处理:修改储存的信息

什么是文件:操作系统提供的虚拟概念,存储信息(用二进制储存信息)

操作文件的流程:

1. 打开文件# ①文件路径②打开模式,w-->write③
print('D:上海python12期视频python12期视频day 09	est.py')#
print('D:上海python12期视频python12期视频day 09\test.py') # \t--》第一个会让第二个失去意义
print(r'D:上海python12期视频python12期视频day 09	est.py') #r会让内部所有的失效
f = open(r'D:上海python12期视频python12期视频day 09	est.py','w',encoding='utf8')

修改/读取文件

f.write('''
孩儿立志出湘关,学不成名誓不还
埋骨何须桑之地,人生无处不青山
''')

保存文件

f.flush()  # 快速保存,你可以不使用

关闭文件:python通过操作系统操作文件

f.close()  # 告诉操作系统关闭文件

2.文件的三种打开模式

读取/写入/追加写入

1 文件打开模式之r模式

r:read,只读模式,只能读不能写,文件不存在时报错。

f = open('32.txt', mode = 'r')  # 报错
f.write()
f.close
# rt : read by text
# windows 的操作系统默认编码为gbk,因此需要utf8编码
f = open('32.txt', mode='rt', encoding='utf8')
data = f.read()
print(data)
print(f"type(data): {type(data)}"")
f.close()
# rb : read by bytes
f = open('32.txt', mode = 'rb')
data = f.read()
print(data)
print(f"type(date): {type(data)}")
f.close()

f.read()读取文件指针会跑到文件的末端,如果再一次读取,读取的将是空格

f = open('32.txt', mode ='rt',encoding='utf8')
data1 = f.read()
data2 = f.read()
print(f"data1:{data1}")
print(f"data2:{data2}")
f.close()

由于f.read()一次读取文件的所有内容,如果文件非常大,可能会造成内存爆掉,即电脑卡死。因此可以用f.readline()/f.readlines()读取内容

# f.readline()/f.readlines
f = open('32.txt',mode='rt', encoding='utf8')
print(f"f.readable();{f.readable)}") # 判断文件是否可读
data1 = f.readline()
data2 = f.readlines()

2 文件打开模式之w模式

w:只能写,不能读,文件存在的时候会清空文件后再写入内容;文件不存在的时候会创建后写入内容

# wt
f = open('34w.txt', mode='wt', encoding='utf8')
print(f"f.readable(): {f.readable()}")
f.write('bob 真帅呀
')  # '
'是换行符
f.write('bob,bob, you drop, I drop.')
f.write('nick 帅的我五体投地')
f.flush()  # 立刻将文件内容从内存刷到硬盘
f.close()
# wb
f = open('34a.txt', mode='wb')
f.write('nick 帅的我五体投地'.encode('unicode_escape'))  # 编码成bytes类型
print(
    f"type('nick 帅的我五体投地'.encode('unicode_escape')): {type('nick 帅的我五体投地'.encode('unicode_escape'))}")
f.close()

3 文件打开模式之a模式

a:可以追加。文件存在,则在文件的末端写入内容;文件不存在的时候会创建文件后写入内容。

# at
f = open('')
f = open('34a.txt', mode='at', encoding='utf8')
print(f"f.readable(): {f.readable()}")
f.write('nick 真帅呀
')  # '
'是换行符
f.write('nick,nick, you drop, I drop.')
f.write('nick 帅的我五体投地')
f.close()

4 文件打开读取二进制

b模式是通用的模式,因为所有的文件在硬盘中都是以二进制的形式储存的,需要注意的是:b模式写文件,一定不能加上encoding参数,因为二进制无法再编码

try:
    import requests
    
    resonse = requests.get(
    	'http://www.chenyoude.com/Python从入门到放弃/文件的三种打开模式-mv.jpg?x-oss-process=style/watermark')
    data = response.content
    
    f = open('mv.jpg?x-oss-process=style/watermark','wb')
    f.write(data)
    print('done...')
    f.close()
except Exception as e:
    print(e,'报错了')
    
f = open('32w.txt','wb')
f.write('bob '.encode('utf8'))
f.close

3.绝对路径

文件路径:文件在硬盘的地址

绝对路径:从盘符开始 E:python12期day09 est.py

相对路径:执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开的文件属于同一文件夹下

未来的项目尽量用相对路径

f = open('test.py', 'r',encoding='utf8')
print(f.read())

windows系统写代码,部署到Linux系统

4.with管理文件操作上下文

with提供一个自动关闭文件

with open('test.py','r',encoding='utf8') as f:
    # print(f.read())
    #在这个缩进下不会关闭文件,在这个缩进下对文件操作
    data = f.read()  # data放到python的内存中
    
print(data)
# 关闭文件(操作系统),没有关闭python内存中的文件
print(f)  # 只涉及到python
# print(f.read())  # 涉及操作系统,报错

5.文件的高级应用(了解)

可读可写 r+

with open('test.py','r+',endoding='utf8') as fr:
    # print(fr.readable())
    # print(fr.writable())
    fr.write('高级')  # 光标在文件头部,覆盖后面代码

可写可读 w+ 和 w 没有任何区别

with open('test.py','w+', encoding='utf8') as fw:
    print(fw.readable())
    print(fw.writable())

可写可读 a+ a模式默认光标在尾部

with open('test.py','a+',encoding='utg8') as fw:
    print(fw.readable())
    print(fw.writable())
    fw.seek(0.0)
    print(fw.read())

综上:如果你真的有即可读又可写的需求,用两种不同的模式打开两次文件

光标的高级应用(移动光标)

seek

with open('test.py', 'rb') as fr:
    fr.seek(5)  # 移动了3个字节,一个中文,默认从头开始
    print(fr.read())
    print(fr.read().decode('utf8'))

whence规定只有0,1,2 三种模式 # 0相当于文件头开始;1相当于当前文件所在位置;2相当于在文件末尾

fr.seek(3,0)  # 0开头
print(fr.read().decode('utf8'))
fr.seek(3.1)
print(fr.read().decode('utg8'))
fr.seek(0,2)
print(fr.read())

tell: 告诉你当前所在位置

with open('test.py','rb')as fr:
    fr.seek(3.0)
    print(fr.tell())

truncate: 截断

with open('test.py','ab') as fa:
    fa.trundate(2)

移动光标(以字符为单位)

read
with open('test.py','r',encoding='utf8') as fr:
    print(fr.read(3))  # 表示n个字符,不加默认读取所有  # 中文和英文都属于一个字符

6.登录注册

注册

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:
        print('登录失败')

7.文件的修改

严格来说文件没有修改一说,只有覆盖

缓存文件的原理

同时打开多个文件

with open('test.py', 'r',encoding='utf8') as fr,/
		open('test_swap.py','w',encoding='utf8') as fw:
	data = fr.read()
	data = data.replace('sb','2b')
    
    fw.write(data)
    
import os

os.remove('test.py')
os.rename('test_swap.py')

with open('test.py','r', encoding='utf8') as fr,
		open('test_swap.py','w', encoding='utf8') as fw:
       #再大的文件都能修改
    for i in fr:
        s = '2b'
        i = i.replace('sb',s)
        fw.write(i)
        # fw.flush()  # 先保存成功再继续运行

1.方法一

将硬盘存放在的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再有内存覆盖到硬盘(word, bim ,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('don...')

总结:以读的方式打开原文件,以写的方式打开一个新文件,把原文件的内容进行修改,然后写入新文件,之后利用os模块的方法,把源文件删除,重命名新文件为原文件名,达到以假乱真的目的。

原文地址:https://www.cnblogs.com/LZF-190903/p/11545251.html