一、文件
1.什么是文件
变量是把数据保存到内存中,如果程序重启或者主机重启,内存中的数据就会丢失。要想数据被持久化存储,就可以把数据存储到硬盘中,也就是在文件中保存
常见的文件的类型如下:
- 文本文件(txt)
- 可执行文件(exe,dll)
- 图片文件(jpg,gif)
- 视频文件(mp4,mov)
- office文件(.ppt,docx)
- ...............
2.文件路径
一个计算机上往往含有很多文件,为了方便,会使用很多的“文件夹”(也叫目录)一层层地来整理文件,一个文件往往是放在一系列的目录结构中的,我们用 文件路径 来描述一个文件的位置
比如:D:\lingling-code
- D:表示盘符,不区分大小写
- 每一个 \ 表示一级目录,上面这个文件就是放在D盘下的lingling-code目录下的
- 目录之间的分隔符可用 \ 也可用 / 。
以 盘符 开头的路径称为 绝对路径
相对路径:需要先指定一个基准目录,然后以基准目录为参照点,间接的找到目录文件
3.文件操作
(1)打开文件
- 使用内建函数 open() 打开文件
f=open('d:/test.txt','r')
第一个参数是字符串,表示要打开的文件路径
第二个参数是一个字符串,表示打开方式。
- r:按照 读方式 打开
- w:按照 写方式 打开
- a:表示 追加写方式 打开
如果文件打开成功,返回一个 文件对象。后续的读写操作都是围绕它展开的。
如果打开失败(如指定的文件不存在),就会抛出异常
(2)关闭文件
- 使用 close() 方法关闭已经打开的文件
f.close()
文件使用完毕后要及时关闭!
- 一个程序能同时打开的文件个数,是存在上限的
flist=[]
count=0
while True:
f=open('d:/test.txt','w')
flist.append(f)
count+=1
print(f'count={count}')
当一个程序打开的文件数量过大时,就会抛出异常
(3)读文件
- 打开方式为 ‘r’, 使用 read()方法 读取文件,参数表示 读取几个字符
f=open('d:/test.txt','r')
result=f.read(5)
print(result)
f.close()
- 如果文件是多行文本,可以使用 for循环 一次读取一行
f=open("D:/test.txt",'w')
f.write('床前明月光\n')
f.write('疑是地上霜\n')
f.write('举头望明月\n')
f.write("低头思故乡\n")
f.close()
f=open('D:/test.txt','r')
for line in f:
print(f'line={line}')
f.close()
由于文件里每一行末尾都带有换行符,print打印一行的时候又会默认加上一个换行符,所以打印结果之间看起来存在空行。
但是我们可以通过下面的操作手动把换行符去掉
print(f'line={line}',end="") #加 end=""
- 使用 readlines()方法 直接把文件整个内容读取出来 ,返回一个列表。每个元素即为一行
f=open("D:/test.txt",'r')
lines=f.readlines()
print(lines)
f.close()
(4)写文件
- 打开方式为“w”,使用 write()方法 写入文件
f=open("D:/test.txt",'w')
f.write('床前明月光\n')
f.close()
打开记事本就能看到写入的内容!
如果用“r”方式打开,写入时会抛出异常;
如果在文件关闭后再写入也会抛出异常。
- 使用 “w” 一旦打开文件成功,就会清空文件原有的数据
- 使用 “a” 实现 “追加写”,此时原有内容不变,写入的内容会存在于之前文件内容的尾部
f=open("D:/test.txt",'w')
f.write('床前明月光\n')
f.write('疑是地上霜\n')
f.write('举头望明月\n')
f.close()
f=open('D:/test.txt','r')
result=f.read(5)
print(result)
f.close()
f=open("D:/test.txt",'w') #第二次写入的方式为 写方式 “w”
f.write("低头思故乡\n")
f.close()
f=open('D:/test.txt','r')
result=f.read(5)
print(result)
f.close()
f=open("D:/test.txt",'w')
f.write('床前明月光\n')
f.write('疑是地上霜\n')
f.write('举头望明月\n')
f.close()
f=open('D:/test.txt','r')
result=f.read(5)
print(result)
f.close()
f=open("D:/test.txt",'a') #第二次写入方式为 追加写方式 “a“
f.write("低头思故乡\n")
f.close()
f=open('D:/test.txt','r')
result=f.read(5)
print(result)
f.close()
观察两段代码和最后的结果,区别在于第二次写入的方式 :
第一个采用 ‘w’方式 写入,当第二次读取文件时,获得的是第二次写入的内容,说明前面的内容被清空了
第二个采用 ‘a’方式 写入,当第二次读取文件时,获得的仍是第一次写入的内容,说明前面的内容没有被清空
4.关于中文的处理
当文件中存在中文时,读取时可能会存在异常。
计算机表示中文的时候,会采取一定的编码方式,我们称为 字符集,本质上就是用数字表示中文
- 一般常用的汉字编码方式,主要是 GBK 和 UTF-8
- 如果此处的编码为 ANSI , 则表示 GBK 编码.
- 如果此处为 UTF-8 , 则表示 UTF-8 编码.
此时修改打开文件的代码, 给 open 方法加上 encoding 参数, 显式的指定为和文本相同的字符集, 问题即可解决
f = open('d:/test.txt', 'r', encoding='utf8')
5.使用上下文管理器
Python提供了 上下文管理器 来帮助我们自动关闭文件
- 使用with语句打开文件
- 当with内部的代码块执行完毕后,就会自动调用关闭方法
with open('d:/test.txt', 'r', encoding='utf8') as f:
lines = f.readlines()
print(lines)