文件操作 模块与包 及 异常处理
文件操作:
打开文件有两种方式: 1、直接打开,需要手动关闭 f = open("文件路径","操作方式","编码类型encoding=") f.close() 2、with 打开,不用考虑关闭文件的问题! with open("文件路径","操作方式","编码类型encoding=") as f: 文件常用操作模式: r 读 只读 读取文件内容 w 写 直接写入会覆盖原文件中的内容! 若文件内有内容,文件刚打开的时,会将之前的内容清掉,如果没有文件的话,会先创建一个文件,再在里边儿写入内容! 如果文件不关,内容可以一直被写入进去! a 追加 在光标位置后边进行追加 文件操作: f.read() #默认直接读取文件内全部内容 f.read(n) #指定读取n个字节的内容 f.readlines(n) #读取文件每一行的内容,列表格式 n 代表读取多少行 f.readline(n) #只读一行内容 n代表读取多少字节 f.write() 写入内容 (写的方式根据文件操作类型决定) f.weitelines() 写入多行 调整光标的位置 f.seek(0) #将光标移到开始位置!不同于read()方法,是按照字节来移动的。 f.seek(1,0)从光标的开始位置往后读取 f.seek(3,1)从当前位置往后读取 f.seek(-3,2)从最后位置往前读取 # 该模式一定按字节操作! 显示多少字节 f.tell() 可读可写模式 r+ w+ a+ r+ 光标位置,追加写入 w+ 打开文件的时候,先把之前文件内容清掉,然后再写入内容, a+ 总是在最后位置添加! 光标直接到最后位置,直接读取读不到任何东西 rb wb ab 二进制操作(字节形式) rb 直接将磁盘中的字节数据放到内存,不需要解码。 wb及ab与rb意思相同,同样的都是将数据以字节的方式写读,不经过解码。 注意点: 当对已经关闭的文件或是有内容的文件更改时,当前的所有操作均不支持在源文件上修改。正确的操作方式是:重新再打开一个新的文件,把原文件及要修改的文件写入。操作完成之后重命名文件。
针对大文件读取:
1、 def read_in_chunks(filePath, chunk_size=1024*1024): file_object = open(filePath) while True: chunk_data = file_object.read(chunk_size) if not chunk_data: break yield chunk_data if __name__ == "__main__": filePath = './path/filename' for chunk in read_in_chunks(filePath): print(chunk) 2、 with open (filePath,"r") as f: for line in f: print(line) 3、 #fileinput模块处理 import fileinput for line in fileinput.input(["filePath"]): print(line)
模块与包:
关于包:必须带__init__.py 文件 basepath = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #以字符串的形式导入模块的方法 import importlib importlib.import_module(字符串)
摘要算法:hashlib 模块
md5()方法 import hashlib m = hashlib.md5() #使用md5方法 m.update('hello'.encode('utf-8')) #传入字节数据,加密 print(m.hexdigest()) #1打印6进制的摘要算法结果
正则 re
1.正则表达式(元字符):只对字符串进行操作 1)操作 一个字符 通配符 点 . 可以替换除了换行符(\n)所有字符, 通配符(一个字符)没有跳过之说。 2)操作 重复字符(操作元字符前的一个字符) * 代表:0到无穷次 + 代表:1到无穷次 ? 代表:0到1次 {} {r,m}代表:有r-m次 \d 代表:0-9 的 数字 [] 字符集 中括号内的字符是或的关系,只要匹配到其中一个就可以。 在字符集中还要注意:*,+ . 等元字符都代表的是普通符号, 而 - ^ \ [^2] 字符集内的 ^ 是取反的意思。及除字符集内的条件其他的都符合,[\d] 表示的还是数字! 3)有特殊意义的字符: - 代表:什么到什么 的意思 例如:[1-9] ^ 开始匹配 从字符串开始位置匹配 $ 结尾匹配 从字符串结尾位置匹配 () 分组 优先匹配分组的内容 (?:内容) 表示取消分组的优先级 | 管道符 表示 或的意思 \ 转义符 将有意义的符号转成无意义的,将无意义的转换成有意义的 1、后面加上一个元字符使其变成普通符号 比如:\. \* 2、将一些普通符号变成特殊符号 比如:\d \w 2、re方法 re.findall(pattern , string) 找到所有的匹配元素,返回列表 re.finditer() #将拿到的东西整成一个可迭代的对象 re.search; 只匹配第一个结果,匹配到就不再向下匹配,返回一个内存地址,通过.group()的方式获取匹配的字符串 re.match:只在字符串开始的位置匹配 re.split(规则,字符串) 分割 以前边的规则表达式为条件分隔符,对字符串进行分割!可在后边限制分割次数 re.sub() 替换 ret4 = re.sub(规则,替换内容,原字符串,次数) 返回一个字符串 re.subn() 替换 返回一个元组(内容,替换次数) re.compile(规则) 编译规则 c = compile('\d+') 可操作多个字符串 ret5 = c.findall('hello32world') print(ret5)
正则表达式—修饰符
正则表达式可以包含一些标志修饰符来控制匹配模式,用在正则表达式处理函数中的flag参数中,为可选参数。
(1) re.I 全写(re.IGNORECASE)
表示使匹配时,忽略大小
(2) re.M 全写(re.MULTILINE)
多行匹配,影响 ^ 和 $的行为
(3) re.S 全写(re.DOTALL)
使点(.)匹配包括换行在内的所有字符
(4) re.X 全写(re.VERBOSE)
这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
(5) 除以上标志外还有re.L和re.U,但不常用
(6) 可以通过使用运算符“|“来指定多个标志,表示同时生效。
os,sys模块
os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd os.curdir 返回当前目录: ('.') os.pardir 获取当前目录的父目录字符串名:('..') os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.remove() 删除一个文件 os.rename("oldname","newname") 重命名文件/目录 os.stat('path/filename') 获取文件/目录信息 os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/" os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' os.system("bash command") 运行shell命令,直接显示 os.environ 获取系统环境变量
os.walk("path") 递归的获取,某目录下的文件绝对路径,文件夹和文件;注意点:文件夹和文件会以列表的形式存储。 os.path.abspath(path) 返回path规范化的绝对路径 os.path.split(path) 将path分割成目录和文件名二元组返回 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;如果path不存在,返回False os.path.isabs(path) 如果path是绝对路径,返回True os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 os.path.getsize(path) 返回path的大小 sys模块:与解释器交互 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys.maxint 最大的Int值 sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 sys.platform 返回操作系统平台名称
import os # print(os.getcwd()) #获取当前工作目录 绝对路径 # # f = open("test.txt","w") # os.chdir(r"") #切换工作路径,参数为绝对路径 # # print(os.curdir) #返回当前目录 打印结果:. # print(os.pardir) 获取当前目录的父目录 .. # os.makedirs("aa/bb") #在当前文件递归创建目录文件 # # os.makedirs("aaa/bbb") #在当前文件递归创建目录文件 # os.removedirs("aaa/bbb") #递归删除多层文件,只会删空目录! # # os.mkdir("ss") #在当前路径下创建一个名为ss的文件 # os.rmdir("ss") #在当前路径下删除一个名为ss的文件 # # print(os.listdir(r'文件夹绝对路径')) #查看该文件夹下有都有那些文件。 # print(os.stat(r"文件的绝对路径")) #获取文件的具体信息,文件的修改时间和创建时间,文件大小 # # print(os.sep) #路径分隔符,根据系统选定 # print(os.linesep) #行终止符, # print(os.pathsep) #路径分隔符, # print(os.name) #操作系统的名字,判断当前操作平台 # # print(os.system("交互式操作命令")) #代码调用交互式命令,相当于在cmd上执行命令, # # print(os.system("dir")) # # os.environ() #获取系统环境变量 # # print(os.path.abspath("文件名")) #获取文件名的绝对路径 # # print(os.path.abspath("test.txt")) #获取文件名的绝对路径 # print(os.path.basename("文件的绝对路径")) #获取绝对路径下 文件的名字 # print(os.path.dirname("文件的绝对路径")) #获取绝对路径下 文件的路径 # # os.path.exists("路径") #判断路径是否存在,返回True;如果path不存在,返回False # os.path.isabs("目录路径") #如果目录路径(路径内不包含文件名)是绝对路径,返回True # os.path.isfile("文件绝对路径") #如果path是一个存在的文件,路径内必须有文件,返回True。否则返回False # os.path.isdir("目录文件名") #如果path是一个存在的目录,则返回True。否则返回False # #os.path.join(path1[, path2[, ...]])路径拼接,可以有多个文件 #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 # os.path.getatime("目录或文件的绝对路径") #返回path所指向的文件或者目录的最后存取时间 # os.path.getmtime("目录或文件的绝对路径") #返回path所指向的文件或者目录的最后修改时间 # os.path.getsize("路径") #返回path的大小 abse = os.path.abspath(__file__) #获取当前文件的绝对路径 mul = os.getcwd() #获取当前文件目录 #判断是否是正确的路径 # print(os.path.exists(abse)) # print(os.path.exists(mul)) #判断目录的路径是否 是绝对路径 # print(os.path.isdir(abse)) # print(os.path.isdir(mul)) #判断一个文件路径或是文件 是否存在, # print(os.path.isfile(abse)) # print(os.path.isfile("test.py")) # print(os.path.isfile(mul)) #判断 当前路径或文件夹名 是否存在,路径内如果包含了文件名那就不是。 print(os.path.isdir(abse)) print(os.path.isdir(mul)) print(os.path.isdir("static"))
#!/usr/bin/python #coding:utf8 import os def listdir(path,fileslist): #传入存储的list for file in os.listdir(path): file_path = os.path.join(path,file) if os.path.isdir(file_path): listdir(file_path,fileslist) else: fileslist.append(file_path) return fileslist print dirlist("/home/testdir", [])
for root,dirs,files in os.walk("path") print(root,dirs,files)
异常处理:
语法: try: 被监测的代码块 except Exception as e: #万能异常 print(e) or pass 异常操作 else: 没有异常时触发 finally: 有没有异常都触发
#举例说明 try: print("=---->") print(x) print("-=--->") except NameError as x: print(x) except Exception as y: print(y) else: print("try内代码块没有异常则执行!") finally: print("无论异常与否,都会执行该模块,通常是进行清理工作") print("继续执行其他操作!") #执行结果: =----> name 'x' is not defined 无论异常与否,都会执行该模块,通常是进行清理工作 继续执行其他操作!
python内部序列化转换方法:pickle,方法与json的序列化与反序列化的方法一样!