目录
1.什么是文件
2.文件路径
3.打开文件
4.关闭文件
5.写文件
6.读文件
7.上下文管理器
1.什么是文件
内存和硬盘都是计算机的存储设备,但它们的功能和工作原理有所不同。
内存(Memory)是计算机中的临时存储器。它被用来存储正在运行的程序和数据,以及操作系统和应用程序所需要的数据。内存是计算机中最快的存储器,但它的容量相对较小且数据保存时间短暂。当计算机关闭或重启时,内存中的数据会被清除。
硬盘(Hard Disk)是计算机中的永久存储器。它被用来保存操作系统、应用程序、用户数据、音频、视频和其他文件。与内存不同,硬盘具有大容量和数据长期保存特性。数据位于硬盘的磁性表面,通过磁头读写。
举例来说,当打开电脑上的一款游戏时,游戏程序和所需数据将被加载到内存中。游戏运行时,玩家的进度和状态数据将实时被存储在内存中。当游戏关闭时,这些内存数据将被清除,但在下次运行时可以重新加载。游戏的安装文件、游戏进度数据和其他文件则会被存储在硬盘中。
内存和硬盘之间的关系是密切的,内存和硬盘都是计算机存储系统的组成部分。计算机的运行速度和性能受内存的大小和速度限制,而硬盘的容量和读写速度则影响了数据的存储和读取效率。内存和硬盘的相互配合,保证了计算机正常运行。
2.文件路径
文件路径:指的是一层一层目录构成的字符串,例如:D:\program\qq\QQ.exe
为了表示qq.exe 这个文件的位置,就可以通过路径的方式来表示~~
知道了文件路径,就可以知道文件在硬盘上的详细位置.
也就可以进一步知道文件里的内容~~使用这个文件
文件路径也可以视为是 文件 在硬盘上的身份标识.
每个文件对应的路径都是唯一的!
C:\PyCharm Community Edition 2022.3.2\lib--->目录名之间,用 \ 来分割,使用 / 也行~
/ :在代码中表示一个文件路径,用 / 更多,使用 \ 不太方便.
\ :在字符串里有特定含义,表示"转义字符".
\\ 在字符串里才表示 字符 \
\ 在字符串里,是特定含义的转义字符~ 例如:\n表示换行.
3.打开文件
python 里面有一个打开函数open 打开一个文件~
注:这里的文本文档.txt是我自己在桌面创建的,
使用\\是因为python中\是转义字符,\\才是真正的 " \ "
open 的返回值, 是一个文件对象~
文件的内容是在硬盘上的.
此处的文件对象,则是内存上的一个变量~
后续读写文件操作,都是拿着这个文件对象来进行操作的~~
此处的文件对象 就像是一个"遥控器" 一样~
计算机中,也把这种远程操控的"遥控器"称为 "句柄" (handler)
4.关闭文件
文件在打开完之后,使用完以后,一定要关闭!!打开文件,其实是在申请一定的系统资源~不再使用文件时,资源应该及时释放. "有借有还,再借不难"否则就可能造成文件资源泄露,进一步导致其他部分的代码无法顺利打开文件了~~正是因为一个系统的资源是有限的,因此程序能打开的文件个数,也是有上限的!
#打开文件个数的上限
flist = []
count = 0
while True:
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt", "r")
flist.append(f)
count += 1
print(f"打开文件的个数:{count}")
虽然这里的文件打开到8189就报错了.但是.在系统中,是可以通过一些设置项,来配置能打开文件的最大数目~~但是无论配置多少,都不是无穷无尽的~~就需要记得及时关闭,释放资源~~
关闭文件,再打开,只要内存足够大,打开文件的个数就越多文件资源泄露,是一个非常严重的问题~~不会第一时间暴露出来,而是在角落里,偷偷的偷袭一下~~在开发过程中要非常注意~
Python中 有一个重要机制,垃圾回收机制(GC),自动的把不使用的变量,给进行释放~虽然python 给了一个后手,让我们在一定程度上避免上述问题,但也不能完全依赖,自动释放机制~~因为自动释放不一定及时~~因此还是需要手动进行释放,避免万无一失~
5.写文件
#使用` write 来实现写文件操作
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","w")
f.write("hello")
f.close()
# 写文件的时候, 需要使用 w 的方式打开. 如果是 r 方式打开, 则会抛出异常
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","r")
f.write("hello")
f.close()
如果是使用 w 方式打开, 会清空掉文件原有的内容!!如果是使用 a 方式打开,则不会清空,写的内容会追加在原有文件的末尾.
# 写方式打开,其实又有两种情况,1.直接方式打开, 2.追加写方式打开~
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","w")
f.write("1111\n")
f.close()
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","a")
f.write("2222\n")
f.close()
# 如果文件对象已经被关闭, 那么意味着系统中和该文件相关的内存资源已经释放了,强行去写,就会出现异常.
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","w")
f.close()
f.write("hello")
6.读文件
利用 read 读取以下文件内容
#使用 read 来读取文件内容,指定读取几个字符
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","r")
result = f.read(2)
print(result)
f.close()
中文和英文类似, 在计算机中, 都市使用 "数字" 来表示字符的哪个字符对应哪个汉字,其实在计算机中,可以有多个版本~~最常见的是: GBK版本 和 UTF8版本 实际开发的时候就需要保证,文件内容的编码方式和代码中操作文件的编码方式,匹配~
上面的代码是尝试利用 GBK 方式进行解析
但是,我们可以看到文档格式是 UTF-8,和读取格式不匹配,所以会报错.所以,解决方法,就是格式统一 ~~此处我们使用的办法,是让代码按照 utf 8 来进行处理~相比于 gbk , utf 8 是使用更广泛的编码方式~
在Python语言中,函数的参数可以分为两类:位置参数和关键字参数。位置参数就是按照参数定义的顺序传递给函数的参数;关键字参数则是通过给参数指定名称来传递。
关键字参数的作用是可以传递默认参数值
位置参数则必须按照参数定义的顺序传递参数值。
这样可以提高代码的可读性和可维护性,因为传递参数时,使用关键字参数可以明确地指定每个参数的含义。
关键字参数和位置参数的关系:当函数同时接收位置参数和关键字参数时,位置参数必须在关键字参数之前传递。例如,定义如下函数:
def greet(name, age):
print(f"Hello {name}, you are {age} years old")
则我们可以使用如下方式调用函数:
greet("Alice", 25) # 使用位置参数
greet(age=25, name="Alice") # 使用关键字参数
注意,上面两个调用的输出结果是一样的,因为当使用关键字参数时,参数的顺序已经不再重要了,只要参数名称正确即可
#使用 read 来读取文件内容,指定读取几个字符
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","r",encoding="utf8")
result = f.read(2)
print(result)
f.close()
#2. 更常见的需求, 按行读取~~
# 最简单的办法, 直接 for 循环.
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","r",encoding="utf8")
for line in f:
print(f"line = {line}")
f.close()
之所以多了个空行,是因为本来读取的文件内容(这一行内容,末尾就带有 \n)此处使用print 来打印,又会自动加一个换行符~so 我们可以给print 再多设定个参数, 修改print 自动添加换行的行为
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","r",encoding="utf8")
for line in f:
print(f"line = {line}",end="")
f.close()
end 参数表示每次打印之后要在末尾加个东西默认是换行符 \n修改成 "也就是啥都不加!
# 3. 还可以使用 readlines 方法直接把整个文件所有内容都读取出来,按照行组织到一个列表里.
f = open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","r",encoding="utf8")
lines = f.readlines()
print(lines)
f.close()
summary:文件较大--->利用for循环,多次读取.文件较小--->利用readlines一次读完
7.上下文管理器
有的时候,我们还是会容易漏掉 close 文件,即使你不会,
你的伙伴也可能漏掉,防不胜防~~
不怕神一样的对手,就怕猪一样的队友~
if cond:
# 进行条件处理
return
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
#另外一些代码
f.close()
so 我们使用上下文管理器(with ... as...)就能解决问题
# 上下文管理器的使用
def func():
with open("C:\\Users\\86178\\Desktop\\新建 文本文档.txt","r",encoding="utf8") as f:
#进行文件这里的逻辑处理
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
if cond:
return
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
#假设这里有很多代码
上下文管理器起到的效果:当 with 对应的代码执行结束 ,就会自动的执行 f 的 close相当于C++里面的智能指针, Java 的 try with Resources, Golang 的 defer
🍁文件的管理器就分享到这里啦~🍁
🍁喜欢就一键三连支持一下吧♥~🍁
🍁谢谢家人们!🍁