34.文件
1.常见的字符编码格式
- python的解释器在内存上使用Unicode。.py文件在磁盘上使用UTF-8存储,这是默认的。当然可以通过
#encoding = 字符编码
来更改在外存上使用的字符编码- UTF-8:英文字符一个字节,通常一个汉字三个字节
2.常用的文件打开模式
- r:以只读模式打开文件,文件指针在文件的开头
- w:以只写模式打开文件,文件指针在文件的开头
- a:以追加模式打开文件
- b:以二进制方式打开文件,需要与其他模式一起使用
- +:以读写方式打开文件,需要与其他模式一起使用
3.文件对象的常用方法
- read:从文件中读取内容
- readline:从文本文件读取一行内容
- readlines:将文本文件每一行作为列表的一个元素,返回列表
- write:向文件写入内容
- writelines:将字符串列表写入文件
- seek:用于移动文件指针
- tell:返回文件指针的当前位置
- flush:将缓冲区的内容写入文件,不关闭文件
- close:将缓冲区的内容写入文件,关闭文件,释放文件对象相关资源
4.读文件的常用方法:
- read()方法
import os.path
#获取在当前工作目录下创建的ee.txt文件的绝对路径
path = os.path.abspath('ee.txt')
print(path) #E:\pythonProject\ee.txt
f = open(path,mode = 'r',encoding = 'utf-8')
content = f.read()
print(content)
f.close()
- read(n):在r模式下,n按照字符的个数读取;b模式时,代表读取n个字节
f = open(R'main.py',mode = 'r',encoding='utf-8')
content = f.read(20) #包括换行符
print(content)
f.close()
- readline():readline读取出来的每一行数据后面都有一个\n,Windows下
f = open(r'E:\pythonProject\ee.txt',mode = 'r',encoding='utf-8')
content1 = f.readline()
content2 = f.readline()
print(content1)
print(content2)
f.close()
# 输出如下
#import numpy as np
#import pandas as pd
解决上诉的问题如下:使用strip方法
f = open(r'main.py',mode = 'r',encoding='utf-8')
content1 = f.readline().strip('\n')
content2 = f.readline().strip('\n')
print(content1)
print(content2)
f.close()
- readlines()方法:
f = open(r'main.py',mode = 'r',encoding='utf-8')
list1 = f.readlines()
print(list1)
f.close()
# ['import numpy as np\n', 'import pandas as pd\n']
- 使用for循环去读取,调用open函数返回的文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存。注意:上面四种方法都不太好,因为如果文件很大会撑爆内存
f = open(r'main.py',mode = 'r',encoding='utf-8')
for line in f:
print(line.strip()) #这种方式就是在一行一行的进行读取
f.close()
# import numpy as np
# import pandas as pd
5.文件操作的其他模式:
-
打开文件的模式有(默认为文本模式):
- r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
- w,只写模式【不可读;不存在则创建;存在则清空内容】
- a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
-
对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jpg格式、视频文件的avi格式)
- rb:主要是操作非文字文件:图片,音频,视频等
- wb:主要是操作非文字文件:图片,音频,视频等
- ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
-
‘+’模式(就是增加了一个功能)
- r+, 读写【可读,可写】
- w+,写读【可写,可读】
- a+, 写读【可写,可读】
-
以bytes类型操作的读写,写读,写读模式
- r+b, 读写【可读,可写】
- w+b,写读【可写,可读】
- a+b, 写读【可写,可读】
6.with语句(上下文管理器)
with语句可以自动管理上下文资源,不论什么原因跳出with块。都能确保文件正确的关闭,以此来达到释放资源的目的
。这和cpp中的智能指针的功能一致,不需要程序员手动释放资源。- with语句的语法:
with 语句块 as 变量
with语句体
- 简单示例:
#with语句可以让我们不用手动关闭文件对象相关资源
with open('aaa.txt','w') as file:
file.write('HelloWorld')
7.目录操作
- os模块与os.path模块用于对文件或者目录操作
- os模块下与操作目录相关的函数:
- getcwd:返回当前的工作目录
- listdir:返回指定路径下的文件和目录信息
- mkdir:创建目录
- makedirs:创建多级目录
- removedirs:删除多级目录
- chdir:将指定的路径设置为当前工作目录
- os.curdir:返回当前目录
- os.pardir:获取当前目录的父目录字符串名
print(os.curdir) #'.' print(os.pardir) #'..'
- os.remove():删除一个文件
- os.rename("oldname","newname") 重命名文件/目录
- os.stat('path/filename') 获取文件/目录信息
import os # 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" # 和操作系统差异相关 print(os.sep) #\ # 输出当前平台使用的行终止符,win下为"\r\n",Linux下为"\n" print(os.linesep) # 输出用于分割文件路径的字符串 win下为;,Linux下为: print(os.pathsep) #; # 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' print(os.name) #nt # os.popen("bash command).read() 运行shell命令,获取执行结果 # 获取系统环境变量 print(os.environ) #os模块:与操作系统相关的模块 import os #打开Windows下的记事本 #os.system('notepad.exe') #os.system('calc.exe') #直接调用可执行文件 #os.startfile('D:\\QQ\\Bin\\qq.exe') #获取当前工作目录 print(os.getcwd()) #E:\pythonProject #返回指定路径下的文件和目录 print(os.listdir('./'))
- os.path模块操作目录相关的函数
- os.path.split():将path分割成目录和文件名以二元组返回。
- os.path.isabs(path):如果path是绝对路径就返回true
- os.path.isfile(path):如果path是一个存在的文件,返回true否则返回false。
- os.path.getatime(path):返回path所指向的文件或者目录的最后访问时间
- os.path.getmtime(path):返回path所指向的文件或者目录的最后修改时间
- os.path.getsize(path) 返回path的大小
import os.path #获取绝对路径 print(os.path.abspath('main.py')) #E:\pythonProject\main.py #判断文件或者目录是否存在 print(os.path.exists('aaa.txt'),os.path.exists('main.py')) #true true #将目录名与文件名拼接起来 print(os.path.join('E:\\example','aaa.txt')) #E:\example\aaa.txt #将目录名与文件名分离 print(os.path.split('E:\\example\\aaa.txt')) #('E:\\example', 'aaa.txt') #将文件名与扩展名分离 print(os.path.splitext('E:\\example\\aaa.txt')) #('E:\\example\\aaa', '.txt') #从一个目录中提取文件名 print(os.path.basename('E:\\example\\aaa.txt')) #aaa.txt #从一个路径中提取文件路径,不包括文件名 print(os.path.dirname('E:\\example\\aaa.txt')) #E:\example,相当于os.path.split('E:\\example\\aaa.txt')[0] print(os.path.isdir('E:\\pythonProject')) #true #获取指定目录下的以后缀名.py结尾的文件 import os #获取当前工作目录 path = os.getcwd() #E:\pythonProject #获取当前工作目录下的所有文件 lst = os.listdir(path) for fileName in lst: if fileName.endswith('.py'): print(fileName)
walk()方法:可以遍历指定目录下的所有文件和子目录下的所有文件
- basename:从一个目录中提取文件名
- dirname:从一个路径中提取文件路径,不包括文件名
- isdir:用于判断是否为路径
- splitext:分离文件名和扩展名
- join:将目录与目录或者文件名拼接起来
- exists:用于判断文件或者目录是否存在
- abspath:用于获取文件或者目录的绝对路径