打开文件

  1. # windows路径分隔符问题
  2. # open('C:\a.txt') # \可能会转义字符,不推荐
  3. # 解决方案一:推荐
  4. open(r'C:\a.txt')
  5. # 解决方案二:
  6. open('C:/a.txt')

执行流程.gif
相对路径

  1. f = open(r'aaa/a.txt', ) # 不指定盘符
  2. print(f)

关闭文件

  • 计算机在过一段时间后,会自动关闭文件
  • 操作系统能同时打开的文件数是有限的(65535)
  • 文件使用完后,建议手动关闭
  1. f = open(r'c:\a.txt', encoding='utf-8')
  2. print(f)
  3. # <_io.TextIOWrapper name='c:\\a.txt' mode='r' encoding='cp936'>
  4. res = f.read()
  5. print(res)
  6. f.close()

with上下文管理

with进行了文件的自动关闭

  1. with open('a.txt', mode='rt') as f1: # f1=open('a.txt',mode='rt')
  2. res = f1.read()
  3. print(res)
  4. # f1.close()
  1. # 打开多文件
  2. with open('a.txt', mode='rt') as f1, \
  3. open('b.txt', mode='rt') as f2:
  4. res1 = f1.read()
  5. res2 = f2.read()
  6. print(res1)
  7. print(res2)
  8. # f1.close()
  9. # f2.close()

编码

文件的读写操作,需要指定程序编码与其一致

  • rt模式下,python在读取文本时会自动把\r\n转换成\n.
  • wt模式下,Python写文件时会用\r\n来表示换行。

没有指定encoding参数操作系统会使用自己默认的编码
linux系统默认utf-8
windows系统默认gbk(cp936)

  1. with open('a.txt', mode='rt') as f: # a.txt是gbk编码
  2. print(f)
  3. res = f.read()
  4. print(res, type(res))

执行流程.gif

模式详解

r模式

  1. # 1、r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置
  2. with open('c.txt', mode='r', encoding='utf-8') as f:
  3. print('第一次读'.center(50, '*'))
  4. res = f.read() # 把所有内容从硬盘读入内存
  5. print(res)
  1. # 案例
  2. inp_username = input('your name>>: ').strip()
  3. inp_password = input('your password>>: ').strip()
  4. # 验证
  5. with open('user.txt', mode='rt', encoding='utf-8') as f:
  6. for line in f:
  7. # print(line,end='') # mufeng:123
  8. username, password = line.strip().split(':')
  9. if inp_username == username and inp_password == password:
  10. print('login successfull')
  11. break
  12. else:
  13. print('账号或密码错误')

执行流程.gif

w模式

  1. # 2、w:只写模式,当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置
  2. with open('d.txt', mode='wt', encoding='utf-8') as f:
  3. # f.read() # 报错,不可读
  4. f.write('擦勒\n')
  1. # 强调1:
  2. # 在以w模式打开文件没有关闭的情况下,连续写入,新的内容总是跟在旧的之后
  3. with open('d.txt',mode='wt',encoding='utf-8') as f:
  4. f.write('擦勒1\n')
  5. f.write('擦勒2\n')
  6. f.write('擦勒3\n')
  1. # 强调2:
  2. # 如果重新以w模式打开文件,则会清空文件内容
  3. with open('d.txt',mode='wt',encoding='utf-8') as f:
  4. f.write('擦勒1\n')
  5. with open('d.txt',mode='wt',encoding='utf-8') as f:
  6. f.write('擦勒2\n')
  7. with open('d.txt', mode='wt', encoding='utf-8') as f:
  8. f.write('擦勒3\n')
  1. # 案例:w模式用来创建全新的文件
  2. # 文件的copy工具
  3. src_file = input('源文件路径>>: ').strip()
  4. dst_file = input('源文件路径>>: ').strip()
  5. with open(r'{}'.format(src_file), mode='rt', encoding='utf-8') as f1, \
  6. open(r'{}'.format(dst_file), mode='wt', encoding='utf-8') as f2:
  7. res = f1.read()
  8. f2.write(res)

a模式

  1. # 3、a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接调到末尾
  2. with open('e.txt', mode='at', encoding='utf-8') as f:
  3. # f.read() # 报错,不能读
  4. f.write('擦嘞1\n')
  5. f.write('擦嘞2\n')
  6. f.write('擦嘞3\n')

强调 w 模式与 a 模式的异同:

  1. 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
  2. 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后

+模式

作用:支持读和写
了解即可
+不能单独使用,必须配合r、w、a

打开文件其实还有3种混合模式
w+ 写读 , 这个功能基本没什么意义,它会创建一个新文件 ,写一段内容,可以再把写的内容读出来,没什么用。
r+ 读写,能读能写,但都是写在文件最后,跟追加一样
a+ 追加读,文件 一打开时光标会在文件尾部,写的数据全会是追加的形式

  1. with open('g.txt', mode='rt+', encoding='utf-8') as f:
  2. print(f.read())
  3. f.write('中国')
  1. with open('g.txt', mode='w+t', encoding='utf-8') as f:
  2. f.write('111\n')
  3. f.write('222\n')
  4. f.write('333\n')
  5. print('====>', f.read())
  1. with open('g.txt', mode='w+t', encoding='utf-8') as f:
  2. f.write('111\n')
  3. f.write('222\n')
  4. f.write('333\n')
  5. print('====>', f.read())
  1. with open('g.txt', mode='a+t', encoding='utf-8') as f:
  2. print(f.read())
  3. f.write('444\n')
  4. f.write('5555\n')
  5. print(f.read())

x模式

x, 只写模式【不可读;不存在则创建,存在则报错】

  1. with open('d.txt', mode='x', encoding='utf-8') as f:
  2. f.write('哈哈哈\n')

b模式

控制文件读写内容的模式

  1. t
  2. 1、读写都是以字符串(unicode)为单位
  3. 2、只能针对文本文件
  4. 3、必须指定字符编码,即必须指定encoding参数
  5. bbinary模式
  6. 1、读写都是以bytes为单位
  7. 2、可以针对所有文件
  8. 3、一定不能指定字符编码,即一定不能指定encoding参数
  9. 总结:
  10. 1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便
  11. 2、针对非文本文件(如图片、视频、音频等)只能使用b模式

执行流程.gif
执行流程.gif

实战

循环读取文件

  1. # 方式一:自己控制每次读取的数据的数据量
  2. with open(r'test.jpg',mode='rb') as f:
  3. while True:
  4. res=f.read(1024) # 1024
  5. if len(res) == 0:
  6. break
  7. print(len(res))

执行流程.gif

  1. # 方式二:以行为单位读,当一行内容过长时会导致一次性读入内容的数据量过大
  2. with open(r'g.txt', mode='rt', encoding='utf-8') as f:
  3. for line in f:
  4. print(len(line), line)
  5. with open(r'g.txt', mode='rb') as f:
  6. for line in f:
  7. print(line)
  8. with open(r'test.jpg', mode='rb') as f:
  9. for line in f:
  10. print(line)

执行流程.gif

文件拷贝工具

  1. # 文件拷贝工具
  2. src_file = input('源文件路径>>: ').strip()
  3. dst_file = input('源文件路径>>: ').strip()
  4. with open(r'{}'.format(src_file), mode='rb') as f1, \
  5. open(r'{}'.format(dst_file), mode='wb') as f2:
  6. # res=f1.read() # 内存占用过大
  7. # f2.write(res)
  8. for line in f1:
  9. f2.write(line)

总结

02 文件的基本操作 - 图8