python3-文件操作
1、文件操作
fp= open(file, mode='r', buffering=-1, encoding=None,errors=None, newline=None, closefd=True, opener=None)
file:文件名称路径,绝对相对都可以
mode:打开文件方式,r,w,a等等,默认不写就是r
encoding:编码方式,跟平台有关系,如果涉及到中文,文件的格式一般都使用utf-8,encoding也需要加上utf-8
例子:fp = open(r"D:\gg\file\a.txt",encoding="utf-8")
fp.read()
一次性全部读出文件内容
fp.read(5) 表示每次读入5个字节,很少用
fp.readline()
读文件一行内容,结尾会有一个换行符"\n"。读完一行,文件操作标记移动到下一行的开头
fp.readllins(5) 表示读入一行个字节,很少用
fp.readlines()
读文件所有内容,返回list,一行一个str,每行最后有换行符"\n"
fp.readlines(5) 表示读入5个字节,很少用
fp.close()
关闭文件,文件打开后必须要关闭
fp.write(str)
把str写到文件中,默认是不加换行符,如果想加,得手动加入换行符'\n'。
fileObject.writelines( seq )
把seq(序列)的内容全部写到文件中(多行一次性写入),不会自动加入换行符。
fp.writelines(["123\n","456\n","789\n"])
fp.flush()
将缓冲区中的内容写入硬盘
testList = ['test1\n', 'test2\n', 'test3', '文件操作']
print(fp.read(), end="\n")
fp.writelines(testList)
fp.flush() # 如果不flush,内容还在缓存区,不会直接写入硬盘;或者fp.close(),这样就会直接写入硬盘
fp1 = open(r"D:\test_dir\ip.txt", 'r')
print(fp1.read(), end="\n")
fp.close()
fp1.close()
fp.tell()
返回文件操作标记的当前位置,以文件的开头为基准点
fp.seek()
seek(offset [,from])文件定位函数,方法改变当前文件的位置,
Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0(默认值),这意味着将文件的开头作为移动字节的参考位置。
如果设为1,则使用当前的位置作为参考位置,
如果它被设为2,那么该文件的末尾将作为参考位置,
1和2的模式需要使用二进制的模式操作
fp.seek(0, 0),把指针再次重新定位到文件开头,用的比较多
如果不确定文件编码,可以使用try....except
def func():
try:
fp = open(r"D:\test_dir\ip.txt", encoding="gbk")
content = fp.read()
fp.close()
return content
except:
try:
fp = open(r"D:\test_dir\ip.txt", encoding="utf-8")
content = fp.read()
fp.close()
return content
except:
return "不是utf-8,也不是gbk"
print(func())
常见mode方式
追加写 a,在文件的最后位置开始写入
fp = open(r"D:\gg\file\1a.txt","a")
r+ 读写,写的时候从开头覆盖写,读的时候从写入后的往下读;如果要全部读,可以使用游标回到开头 fp.seek(0,0)
rb,wb 二进制读写,主要用于读写非文本文件,图片等,不能加encoding参数
不知道文件编码类型,通过chardet.detect检测出类型,再解码使用
fp = open(r"D:\test_dir\ip.txt","rb")
content= fp.read()
fp.close()
print(content)
import chardet
print(chardet.detect(content)["encoding"]) # 检测出编码类型
print(content.decode(chardet.detect(content)["encoding"])) # 打印内容
输出内容
b'test1\r\ntest2\r\ntest3\xe6\x96\x87\xe4\xbb\xb6\xe6\x93\x8d\xe4\xbd\x9c'
utf-8
test1
test2
test3文件操作
2、序列化
dump 将指定的Python对象通过pickle序列化后写入打开的文件对象中
load 从打开的文件对象中读取pickled对象表现形式并返回通过pickle反序列化后得到的Python对象
import pickle
a=1
fp=open("d:\\a.txt","wb")
pickle.dump(a,fp)
fp.close()
fp=open("d:\\a.txt","rb")
print(pickle.load(fp))
fp.close()
序列化可以存多个
a=[1,2,4]
b={1:2,3:4}
c={1,2,3}
fp=open("d:\\a.txt","wb")
pickle.dump(a,fp)
pickle.dump(b,fp)
pickle.dump(c,fp)
fp.close()
fp=open("d:\\a.txt","rb")
a=pickle.load(fp)
b=pickle.load(fp)
c=pickle.load(fp)
fp.close()
print(a)
print(b)
print(c)
3、目录操作
使用os包 import os
os.getcwd()
返回当前工作目录,即当前Python脚本工作的目录路径
os. chdir(path)
改变当前脚本工作目录, 相当于shell下的cd命令
os.curdir
返回 . 很少用
os.pardir
返回当前目录的父目录('..'),一般与os.chdir一起使用
import os
print(os.getcwd()) # D:\gg\biji
os.chdir(os.pardir)
print(os.getcwd()) # D:\gg
os.chdir("..")
print(os.getcwd()) # D:\
os.name
返回当前使用的操作系统类型(其中 ‘nt’是 windows,’posix’ 是 linux 或者unix),很少用
os.mkdir(path [, mode=0777])
生成单级目录;相当于linux中的mkdir dirname。
参数mode表示生成的目录的权限,默认是超级权限,也就是0777
如果目录存在会报错 ”FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件“
os.mkdir(r'c:\gloryroad') # 绝对或者相对路径都可以
os.makedirs(path [, mode=0777])
可生成多层递归目录,父目录如果不存在,递归生成。
参数mode表示生成的目录的权限,默认是超级权限,也就是0777
os.makedirs(r"dir1\dir2\dir3") # 绝对或者相对路径都可以
如果目录全部存在会报错 ”FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件“
os.remove(filePath)
删除一个指定的文件,参数filePath表示文件所在的路径。
注意:该方法只能删除文件,不能删除目录
os.rmdir(path)
删除单级空目录,若目录不为空则无法删除,会报错;相当Linux中的 rmdir dirname
os.removedirs(path)
若目录为空(有文件或者文件夹就不算是空),则删除,并递归到上一级目录,如若也为空,则删除,依次类推
例子:
os.removedirs(r"dir1\dir2\dir3\dir4") dir3,dir4删除了,dir2下面有11.txt文件,就没有删除
os.listdir(path)
以列表形式返回,指定目录下的所有文件和子目录,包括隐藏文件或目录
path参数为空,指当前目录
os.rename(oldname, newname)
重命名文件/目录
os.rename(r"dir1\dir2\11.txt", r"dir1\dir2\22.txt") 11.txt文件名重命名为22.txt
os.rename(r"dir1\dir2", r"dir1\dir3") dir2文件夹名改为dir3,如果dir2中存在文件或者目录都可以成功命名
os.stat(path) (很少用)
打印出文件信息
print(os.stat("a.py"))
os.stat_result(st_mode=33206, st_ino=53761720551743073, st_dev=739301148, st_nlink=1, st_uid=0, st_gid=0, st_size=113, st_atime=1630832165, st_mtime=1630829206, st_ctime=1630831903)
stat 结构:
- st_mode: inode 保护模式
- st_ino: inode 节点号。
- st_dev: inode 驻留的设备。
- st_nlink: inode 的链接数。
- st_uid: 所有者的用户ID。
- st_gid: 所有者的组ID。
- st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
- st_atime: 上次访问的时间。
- st_mtime: 最后一次修改的时间。
- st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
os.utime(path[, (atime, mtime)])
修改文件的时间属性,设置文件的access and modified time为给定的时间,
如果未指定atime和mtime参数,修改的时间将会是当前的时间
os.utime("11.txt",(1375448978,1369735977))
os.system (command)
运行shell命令
os.system("dir")
os.sep
输出操作系统的特定的路径分隔符。Win下为“\”,Linux下为“/”
os.walk
os.walk(top, topdown=True, onerror=None, followlinks=False)
参数说明:
top:表示需要遍历的目录树的路径。
topdown的默认值是“True”,深度优先,表示首先返回目录树下的文件,然后遍历目录树下的子目录。值设为False时,广度优先,则表示先遍历目录树下的子目录,返回子目录下的文件,最后返回根目录下的文件。
onerror的默认值是“None”,表示忽略文件遍历时产生的错误。如果不为空,则提供一个自定义函数提示错误信息后继续遍历或抛出异常中止遍历。该函数返回一个列表,列表中的每一个元素都是一个元组,该元组有3个元素,分别表示每次遍历的路径名,目录列表和文件列表。
默认情况下,os.walk 不会遍历软链接指向的子目录,若有需要请将followlinks设定为true
for root,dirs,files in os.walk(path):
print("root: ", root)
print("dir: ", dirs)
print("file: ", files)
os.pathsep
输出用于分割文件路径的字符串 ,;
os.linesep
输出当前平台是用的行终止符,win下为“\r\n”,Linux下为“\n”,Mac使用'\r'
os.environ 很少用
获取系统环境变量。
该类中还有一些其他的方法,比如设置环境变量等,有需要自省查阅
os.path.abspath(path)
返回path规范化的绝对路径(但这个路径不一定是真实存在的路径),
如果path仅是一个文件名,使用该函数后返回的路径则是当前工作目录路径连接该文件名后所组成的新的路径名。
os.path.split(path)
将path分割成目录和文件名,并存于元组中返回
如果你完全使用目录,会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在
print (os.path.split(r'c:\a.py')) 输出 ('c:\', 'a.py')
os.path.dirname(path)
返回path的目录路径,其实就是os.path.split(path)的第一个元素
os.path.basename(path)
返回path最后的文件名。如果path以/或\结尾,就会返回空值。即os.path.split(path)的第二个元素。
os.path.exists(path)
判断path是否存在,如果存在返回True,否则返回False
os.path.isabs(path)
判断path是否是绝对路径,如果是返回True,否则返回False
路径是否存在,文件是否存在不会判断
os.path.isfile(path)
判断path是否是文件,如果是返回True,否则返回False
os.path.isdir(path)
判断path是否是目录,如果是目录返回True,否则返回False
os.path.normpath(path) (感觉没啥用)
将path转换成规范的文件路径
print(os.path.normpath('c:/test/a.py')) 输出 c:\test\a.py
os.path.getsize(name)
获得文件大小,如果name是目录返回结果是0L或者4096L;
如果name代表的目录或文件不存在,怎会报WindowsError异常
os.path.join(a, p) (用的最多)
连接两个或更多的路径名,中间以“\”分隔,
如果所给的参数中都是绝对路径名,那先给的绝对路径将会被丢弃
print(os.path.join('c:\aa\11',"22",'d:\a.txt',"33")) 输出 d:\a.txt\33
os.path.splitext(path) (没啥用)
分离文件名与扩展名
print (os.path.splitext(r'c:\a.py')) 输出 ('c:\a', '.py')
os.path.splitdrive(path) (没啥用)
拆分驱动器和文件路径,并以元组返回结果;主要针对win有效,Linux元组第一个总是空
os.path.getatime(filename)
返回文件的最后访问时间,返回的是时间戳
os.path.getctime(filename)
以时间戳的形式返回文件或目录的创建时间,在Unix系统上是文件最近更改的时间,在Windows上是文件或目录的创建时间
os.path.getmtime(filename)
返回文件最后一次修改的时间,返回的是时间戳
4、sys模块
终止当前进程:
sys.exit(0) 正常退出
sys.exit(1) 非正常退出
import sys
print("start")
sys.exit(0) # 把程序退出 exit(0):无错误退出 exit(1):有错误退出
print("end!")
sys.stdin.readline()
和input()一样
标准输出和标准错误(通常缩写为 stdout 和 stderr)是建立在每个UNIX系统内的管道(pipe)。当你 print 某东西时,结果输出到 stdout 管道中;当你的程序崩溃并打印出调试信息时(象Python中的错误跟踪),结果输出到 stderr 管道中。通常这两个管道只与你正在工作的终端窗口相联,所以当一个程序打印输出时,你可以看到输出,并且当一个程序崩溃时,你可以看到调试信息。(如果你在一个基于窗口的Python IDE系统上工作,stdout 和 stderr 缺省为“交互窗口”。)
错误输出是红色,它打印的位置不一定,有可能在1111111111的下面
import sys
for i in range(3):
sys.stdout.write('1111111')
print ('\n','_'*60,'\n')
for i in range(3):
sys.stderr.write('2222222')