9、Python文件读取

一、补充知识点

  • 变量都是归属于应用程序的内存, 例如x= 10归属于python的内存空间

二、文件

​ 应用程序运行过程中产生的数据最先都是存放于内存中的,若想永久保存下来,必须要保存于硬盘中。应用程序若想操作硬件必须通过操作系统,而文件就是操作系统提供给应用程序来操作硬盘的虚拟概念,用户或应用程序对文件的操作,就是向操作系统发起调用,然后由操作系统完成对硬盘的具体操作。
在这里插入图片描述

2.1 什么是文件?

  文件是操作系统提供给用户/应用程序 操作硬盘的一种虚拟的概念/接口
  用户/应用程序(open)
  操作系统(文件)
  计算机硬件(硬盘)

2.2 为什么要用文件?
  • 将原本存放于内存中的数据保存在硬盘中
      用户/应用程序可以通过文件将数据永久保存在硬盘中,即操作文件就是操作硬盘
      用户/应用程序直接操作的是文件, 对文件进行的所有操作, 都是在向操作系统发送系统调用,然后再由操作系统将其转换成具体的硬盘操作
2.3 如何用文件?
  • open()

三、文件的使用

3.1 基本操作流程
  • 操作文件的基本流程
      1、打开文件
# windows路径分隔符问题
open'C:\a\nb\c\d.txt'# 解决方案一:推荐
openr'C:\a\nb\c\d.txt'# 解决方案二:
open'C:/a/nb/c/d.txt'# 绝对路径 : 全部路径
# 相对路径 : 相对于当前文件为起始
# 有无返回值  有 f的值是一种变量,占用的是应用程序的内存空间
f = open(r'aaa/a.txt', mode='rt')

  2、操作文件:读/写文件, 应用程序对文件的读写请求都是在向操作系统发送系统调用,然后由操作系统控制硬盘把数据读入内存,或者写入硬盘,

res = f.read()

  3、关闭文件

f.close() # 回收操作系统的资源   操作系统的打开文件数是一定的
def f     # 回收应用程序的资源 (不需要有垃圾回收机制)
3.2 模式介绍
  • 控制文件读写内容的模式: t和b, t和b不能单独使用, 必须和r/w/a连用
  • 控制文件读写操作的模式:
        r :只读模式
        w :只写模式
        a : 只追加写模式
        + : r+、w+、a+ 可读可写
        x :了解x模式
3.3 详细介绍文件模式t、b、r、w、a、+、x
  • t :文本(默认的模式)
      1、读写都是以str(unicode)为单位的
      2、只针对文本文件
      3、必须指定一个编码encoding=“utf-8”
# 对于f.read来说是将f就是文件对象, 向操作系统发请求,请求将硬盘(utf-8格式的二进制)上的c.txt读取到内存中, 但是用的是t模式, 读出来的一定是str(unicode)的格式
# 所以f.read本质读取的是utf-8但是模式t强制将read读出来的结果解码(utf-8)成unicode
with open('c. txt', mode=' rt',) as f: 
	res=f. read()
	print(res, type(res))
# 结论: 操作系统默认的编码,对于open的encoding:liunx系统默认是utf-8, windows系统默认是gbk
  • b :二进制/Bytes
      1、读写都是以Bytes为单位的
      2、可以针对所有文件
      3、一定不能指定字符编码encoding
with open('test.jpg', mode=' rb',) as f: 
	res=f. read() # 硬盘的二进制读入内存->b模式下,不做任何转换, 直接读入内存
	print(res, type(res))# bytes类型-》当成二进制
  • r :只读模式,当文件不存在时报错,当文件存在时文件指针跳到开头
with open('c.txt',mode='rt',encoding='utf-8')as f:
	print('第一次读.center(50, '*'))
	res=f.read() # 把所有内容从硬盘读入内存
	print(res)
#with open('c.txt',mode='rt',encoding='utf-8')as f:
	print('第二次读.center(50, '*')
	res1 =f.read()
	print(res1) # 为空  因为指针指到文件末尾
  • w : 只写模式、当文件不存在的时候会创建一个空文件, 当文件存在时w会清空文件, 指针为于开始位置,
# 重新以w模式打开文件, 文件会清空
with open('d.txt',mode='wt',encoding='utf-8')as f:
	#f.read()#不可读I
	f.write('哈哈哈哈\n')
  • a :只写模式 只追加写、文件不存在时创建空文档, 在文件存在时, 文件指针之直接跳到末尾。

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

  • 了解+模式 :可读可写 必须配合r、w、a

r 指针在开头
w指针在末尾, 读不出来
a指针在末尾, 读不出来
  • x :只写模式, 【不可读; 不存在则创建, 存在则报错, 指针在开头】# 就是加了一个判断
3.4 资源回收与with语法
  • with上下文管理
# 文件对象又称为文件句柄(手柄 操作文件的)
# with会帮你f.close()
with open('a.txt', mode='rt') as f:
	res = f.read() # 操作系统把文件从硬盘读到了内存
# with 可以同时打开多个
with open('a.txt', mode='rt') as f open('b.txt', mode='rt') as f1:
	res = f.read() # 操作系统把文件从硬盘读到了内存
	res1 = f1.read()
3.5 文件的操作的其他方法
  • readline
# readline:一次读一行 readlines: 读取大列表全部
with open(r'g.txt',mode='rt',encoding='utf-8')as f:
	resl=f.readline()  # 与for循环相等
	for line in f:
		line=line
# writelines 相当于for循环
#1=['11111\n',2222','3333',4444]
J=[11111\n','2222','3333]
for line in 1:
	f.write(line)
f.writelines(l)
  • 如果是纯英文字符,可以直接加前缀b得到bytes类型
  • ‘上’.encode(‘utf-8)等同于bytes('上’,encoding='utf-8)
  • flush
# flush:
with open('h.txt',mode='wt',encoding='utf-8')as f:
	f.write('哈') # 告诉操作系统把数据给我从内存发到硬盘, 但是不是你写点就发送的 人话就是卡车运货
	f.flush() # 写完立即发送到硬盘
3.6 文件的高级操作:控制文件指针的移动
  • 指针移动的单位: 字节(Bytes)
  • 只有一中情况特殊:
      t 模式下的read(n)、n代表的是字符个数
      其他涉及指针的单位都是字节(Bytes)
  • f.seek(n,模式):n指的是移动的字节个数
    • 模式:

        1、 0:参照物是文件开头位置

f.seek(90) # 文件指针走到第9个位置
f.seek(30) # 文件指针走到第3个位置

        2、 1:参照物是当前指针所在位置

f.seek(91) # 文件指针走到第9个位置
f.seek(31) # 文件指针走到第13个位置

        3、 2:参照物是文件末尾、应该到这移

# 一共12个位置
f.seek(92) # 文件指针走到第12个位置
f.seek(-32) # 文件指针走到第9个位置
  • 强调: 只有0模式可以在t下使用, 1、2必须在b模式下用
  • f.tell():获取指针当前的位置(以字节为单位)
3.7 文件修改的两种方式
3.7.1 文本编辑器修改内容的流程
  • 硬盘上的数据就没有改这一说、全都是覆盖。内存是可以改的
  • 拓展:平时在文本编辑器改内容的流程
        1、打开文件:文件全部内容从硬盘加载到内存a.txt
        2、改写:改的是内存
        3、改完保存:从新将文件a.txt的内容覆盖到硬盘
3.7.2 文件修改的两种方式
  • 方式一:文本编辑器采用的就是这种方式
    • 优点: 浪费了内存空间
# 缺点: 文件过大会占用内存过大 
with open('c.txt', mode='rt',encoding='utf-8')as f:
	res = f.read()
	data = res.replace('a', 'b')
	print(data)
with open('c.txt', mode='wt', encoding='utf-8')as f1:
	f1.write(data)
  • 方式二:
    • 优点: 浪费了硬盘空间
#  
import os 
with open('c.txt', mode='rt', encoding='utf-8')as f,\
	open('.c.txt.swap', mode='wt', encoding='utf-8")as f1:
	for line in f:
		fl.write(line.replace('a','b'))
# 删除旧的
os.remove('c.txt')
# 将新的改成旧的名字
os.rename('.c.txt.swap', 'c.txt')

相关连接(笔记来自于视频课程和知乎的归类整理):
[1]: https://www.bilibili.com/video/BV1QE41147hU?p=17
[2]: https://zhuanlan.zhihu.com/p/108808704

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值