打开文件
# windows路径分隔符问题
# open('C:\a.txt') # \可能会转义字符,不推荐
# 解决方案一:推荐
open(r'C:\a.txt')
# 解决方案二:
open('C:/a.txt')
相对路径
f = open(r'aaa/a.txt', ) # 不指定盘符
print(f)
关闭文件
- 计算机在过一段时间后,会自动关闭文件
- 操作系统能同时打开的文件数是有限的(65535)
- 文件使用完后,建议手动关闭
f = open(r'c:\a.txt', encoding='utf-8')
print(f)
# <_io.TextIOWrapper name='c:\\a.txt' mode='r' encoding='cp936'>
res = f.read()
print(res)
f.close()
with上下文管理
with进行了文件的自动关闭
with open('a.txt', mode='rt') as f1: # f1=open('a.txt',mode='rt')
res = f1.read()
print(res)
# f1.close()
# 打开多文件
with open('a.txt', mode='rt') as f1, \
open('b.txt', mode='rt') as f2:
res1 = f1.read()
res2 = f2.read()
print(res1)
print(res2)
# f1.close()
# f2.close()
编码
文件的读写操作,需要指定程序编码与其一致
- rt模式下,python在读取文本时会自动把\r\n转换成\n.
- wt模式下,Python写文件时会用\r\n来表示换行。
没有指定encoding参数操作系统会使用自己默认的编码
linux系统默认utf-8
windows系统默认gbk(cp936)
with open('a.txt', mode='rt') as f: # a.txt是gbk编码
print(f)
res = f.read()
print(res, type(res))
模式详解
r模式
# 1、r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置
with open('c.txt', mode='r', encoding='utf-8') as f:
print('第一次读'.center(50, '*'))
res = f.read() # 把所有内容从硬盘读入内存
print(res)
# 案例
inp_username = input('your name>>: ').strip()
inp_password = input('your password>>: ').strip()
# 验证
with open('user.txt', mode='rt', encoding='utf-8') as f:
for line in f:
# print(line,end='') # mufeng:123
username, password = line.strip().split(':')
if inp_username == username and inp_password == password:
print('login successfull')
break
else:
print('账号或密码错误')
w模式
# 2、w:只写模式,当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置
with open('d.txt', mode='wt', encoding='utf-8') as f:
# f.read() # 报错,不可读
f.write('擦勒\n')
# 强调1:
# 在以w模式打开文件没有关闭的情况下,连续写入,新的内容总是跟在旧的之后
with open('d.txt',mode='wt',encoding='utf-8') as f:
f.write('擦勒1\n')
f.write('擦勒2\n')
f.write('擦勒3\n')
# 强调2:
# 如果重新以w模式打开文件,则会清空文件内容
with open('d.txt',mode='wt',encoding='utf-8') as f:
f.write('擦勒1\n')
with open('d.txt',mode='wt',encoding='utf-8') as f:
f.write('擦勒2\n')
with open('d.txt', mode='wt', encoding='utf-8') as f:
f.write('擦勒3\n')
# 案例:w模式用来创建全新的文件
# 文件的copy工具
src_file = input('源文件路径>>: ').strip()
dst_file = input('源文件路径>>: ').strip()
with open(r'{}'.format(src_file), mode='rt', encoding='utf-8') as f1, \
open(r'{}'.format(dst_file), mode='wt', encoding='utf-8') as f2:
res = f1.read()
f2.write(res)
a模式
# 3、a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接调到末尾
with open('e.txt', mode='at', encoding='utf-8') as f:
# f.read() # 报错,不能读
f.write('擦嘞1\n')
f.write('擦嘞2\n')
f.write('擦嘞3\n')
强调 w 模式与 a 模式的异同:
- 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
- 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
+模式
作用:支持读和写
了解即可
+不能单独使用,必须配合r、w、a
打开文件其实还有3种混合模式
w+ 写读 , 这个功能基本没什么意义,它会创建一个新文件 ,写一段内容,可以再把写的内容读出来,没什么用。
r+ 读写,能读能写,但都是写在文件最后,跟追加一样
a+ 追加读,文件 一打开时光标会在文件尾部,写的数据全会是追加的形式
with open('g.txt', mode='rt+', encoding='utf-8') as f:
print(f.read())
f.write('中国')
with open('g.txt', mode='w+t', encoding='utf-8') as f:
f.write('111\n')
f.write('222\n')
f.write('333\n')
print('====>', f.read())
with open('g.txt', mode='w+t', encoding='utf-8') as f:
f.write('111\n')
f.write('222\n')
f.write('333\n')
print('====>', f.read())
with open('g.txt', mode='a+t', encoding='utf-8') as f:
print(f.read())
f.write('444\n')
f.write('5555\n')
print(f.read())
x模式
x, 只写模式【不可读;不存在则创建,存在则报错】
with open('d.txt', mode='x', encoding='utf-8') as f:
f.write('哈哈哈\n')
b模式
控制文件读写内容的模式
t:
1、读写都是以字符串(unicode)为单位
2、只能针对文本文件
3、必须指定字符编码,即必须指定encoding参数
b:binary模式
1、读写都是以bytes为单位
2、可以针对所有文件
3、一定不能指定字符编码,即一定不能指定encoding参数
总结:
1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
2、针对非文本文件(如图片、视频、音频等)只能使用b模式
实战
循环读取文件
# 方式一:自己控制每次读取的数据的数据量
with open(r'test.jpg',mode='rb') as f:
while True:
res=f.read(1024) # 1024
if len(res) == 0:
break
print(len(res))
# 方式二:以行为单位读,当一行内容过长时会导致一次性读入内容的数据量过大
with open(r'g.txt', mode='rt', encoding='utf-8') as f:
for line in f:
print(len(line), line)
with open(r'g.txt', mode='rb') as f:
for line in f:
print(line)
with open(r'test.jpg', mode='rb') as f:
for line in f:
print(line)
文件拷贝工具
# 文件拷贝工具
src_file = input('源文件路径>>: ').strip()
dst_file = input('源文件路径>>: ').strip()
with open(r'{}'.format(src_file), mode='rb') as f1, \
open(r'{}'.format(dst_file), mode='wb') as f2:
# res=f1.read() # 内存占用过大
# f2.write(res)
for line in f1:
f2.write(line)