√ 1、掌握Python文件读、写常用操作
√2、学习如何读取大文件编码技巧。
√3、掌握Python异常检测和异常处理。
Python文件基本操作
Python中,对文件的操作有很多种,常见的操作包括创建、删除、修改权限、读取、写入等,这些操作可大致分为以下2类:
√删除、修改权限:作用于文件本身,属于系统级操作。
√ 写入、读取:是文件最常用的操作,作用于文件的内容,属于应用级操作。
文件的应用级操作可以分为以下3步,每一步都需要借助对应的函数实现:
- 打开文件:使用open()函数,该函数会返回一个文件对象;
- 对已打开文件做读/写操作:读取文件内容可使用read()、readline()以及readlines()函数;向文件中写入内容,可以使用write()函数。
- 关闭文件:完成对文件的读/写操作之后,最后需要关闭文件,可以使用close()函数。
Python open()函数详解
open()函数用于创建或打开指定文件,该函数的常用语法格式如下:
file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]l)
此格式中,用括起来的部分为可选参数。其中,常用参数所代表的含义如下:
- file:表示要创建的文件对象。
- file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。
- mode:可选参数,用于指定文件的打开模式。如果不写,则默认以只读(r)模式打开文件。
- encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding参数值也不同,以Windows为例,其默认为cp836(实际上就是GBK编码)。
如图所示,当前文件没有传入mode,默认为只读,且文件在当前目录下可找到。
如图所示,读取图片,视频,音频要使用二进制rb的方式读取
如图所示,如果遇到文件解码问题可以指定解码方式。
Python read()函数:按字节(字符)读取文件
Python 提供了如下3种函数,它们都可以帮我们实现读取文件中数据的操作:
- read()函数:逐个字节或者字符读取文件中的内容;
- readline()函数:逐行读取文件中的内容;
- readlines()函数:一次性读取文件中多行内容。
1、Python read()函数
read()函数的基本语法格式如下: file.read([size])
其中,file表示已打开的文件对象;size作为一个可选参数,用于指定一次最多可读取的字符(字节)个数,如果省略,则默认一次性读取所有内容。
11
read(函数抛出UnicodeDecodeError异常的解决方法
在使用read()函数时,如果Python解释器提示UnicodeDecodeError异常或者显示为乱码,其原因在于,目标文件使用的编码格式和open()函数打开该文件时使用的编码格式不匹配。
例如图所示:ping百度并且将结果打印出来
解决方法:导入包chardet
inport chardet
#line为要检测的字段,结果为gb2312.
print(chardet.detect(line))
Python readline()和readlines()函数:按行读取文件
和read()函数不同,这2个函数都以“行”作为读取单位,即每次都读取目标文件中的一行。
1、Python readline()函数
readline()函数用于读取文件中的一行,包含最后的换行符“n”。此函数的基本语法格式为: file.readline([size])其中,file为打开的文件对象;size为可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数。
读取一行中的五个数据:
2、Python readlines()函数
readlines()函数用于读取文件中的所有行,它和调用不指定 size参数的read()函数类似,只不过该函数返回是一个字符串列表,其中每个元素为文件中的一行内容。
readlines()函数的基本语法格式如下: file.readlines()
其中,file为打开的文件对象。和read()、 readline()函数一样,它要求打开文件的模式必须为可读模式(包括r、rb、『+、rb+4种)。
Python:读取大文件(GB)
Python读取文件一般是利用open()函数以及read()函数来完成,但该方式仅适合读取小文件。因为调用read()会一次性读取文件的全部内容,调用readlines()一次读取所有内容并按行返回list。如果文件过大,如10G,会造成MemoryError内存溢出(取决于计算机内存大小,如果文件10G,内存4G则溢出,反之内存16G则不会溢出),正确的做法:可以反复调用read(size)方法,每次指定读取size个字节的内容。
处理大文件核心思路:通过参数指定每次读取的大小长度,这样就避免了因为文件太大读取出问题。
while True:
block = f.read(1024) #每次读取1M
if not block:
break
Python write()和writelines():向文件中写入数据
1、Python write()函数
Python 中的文件对象提供了write()函数,可以向文件中写入指定内容。该函数的语法格式如下: file.write(string)
其中:
- file表示已经打开的文件对象;
- string表示要写入的字符串。
2、Python writelines()函数
Python的文件对象中,不仅提供了write()函数,还提供了writelines()函数,可以实现将字符串列表写入文件中。
Python seek()和tell()函数详解
实现对文件指针的移动,文件对象提供了tell()函数和seek()函数。tell()函数用于判断文件指针当前所处的位置,而seek()函数用于移动文件指针到文件的指定位置。
1、tell()函数
tell()函数的用法很简单,其基本语法格式如下: file.tell()
2、seek()函数
seek()函数用于将文件指针移动至指定位置,该函数的语法格式如下: file.seek(offset[, whence])
Python使用with as语法读写文件
在Python中,使用with as语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。
with as语句的基本语法格式为:
with表达式[as target]:
代码块
此格式中,用括起来的部分可以使用,也可以省略。其中,target参数用于指定一个变量,该语句会将expression指定的结果保存到该变量中。
Python fileinput模块:逐行读取多个文件
Python提供了fileinput模块,通过该模块中的input()函数,我们能同时打开指定的多个文件,还可以逐个读取这些文件中的内容。
fileinput模块中input()该函数的语法格式如下:
fileinput.input (files="filename1, filename2,..." , inplace=False, backup=", bufsize=0, mode='r', openhook=None)
其中,各个参数的含义如下:
- files:多个文件的路径列表;
- inplace:用于指定是否将标准输出的结果写回到文件,此参数默认值为False;
- backup:用于指定备份文件的扩展名;
- bufsize:指定缓冲区的大小,默认为0;
- mode:打开文件的格式,默认为r(只读格式);
- openhook:控制文件的打开方式,例如编码格式等。
读取单个文件
同时读取多个文件
111
Python linecache模块:读取文件指定行
除了可以借助fileinput模块实现读取文件外,Python还提供了linecache模块。和前者不同,linecache模块擅长读取指定文件中的指定行。换句话说,如果我们想读取某个文件中指定行包含的数据,就可以使用linecache模块.
python常见异常类型
扁写程序时遇到的错误可大致分为2类,分别为语法错误和运行时错误。
Python常见异常类型
1、Python语法错误
语法错误,即解析代码时出现的错误。当代码不符合Python语法规则时,Python解释器在解析时就会报出SyntaxError语法错误,与此同时还会明确指出最早探测到错误的语句。
示例: print "Hello,World!"
Python 3已不再支持上面这种写法,所以在运行时,解释器会报语法错误。
2、Python运行时错误
运行时错误,即程序在语法上都是正确的,但在运行时发生了错误。
示例: a = 1/0
上面这句代码的意思是“用1除以0,并赋值给a。因为О作除数是没有意义的,所以运行后会产生运行时错误。
在Python中,把这种运行时产生错误的情况叫做异常(Exceptions),常见的几种异常情况如下。
Python try except异常处理详解
当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try...except.结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。
捕获所有异常:
捕获指定异常IOError:
捕获多个异常:
Python try except else详解
- 在原本的try except结构的基础上,Python异常处理机制还提供了一个else块,也就是原有try except语句的基础上再添加一个else块,即try except else结构。
- 使用else包裹的代码,只有当try 块没有捕获到任何异常时,才会得到执行;反之,如果try 块捕获到异常,即调用对应的except来处理异常,else 块中的代码也不会得到执行。
Python try except finally:资源回收
Python异常处理机制还提供了一个finally语句,通常用来为try块中的程序做扫尾清理工作。
在整个异常处理机制中,finally语句的功能是:无论try 块是否发生异常,最终都要进入finally语句
并执行其中的代码块。
Python raise主动触发异常
当程序出现错误,Python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句raise后面的语句将不能执行。
raise语句的基本语法格式为:raise [exceptionName [(reason)]]
raise语句有三种常用的用法:
- raise:单独一个raise。该语句引发当前上下文中捕获的异常(比如在except 块中),或默认引发RuntimeError异常。
- raise 异常类名称: raise后带一个异常类名称,表示引发执行类型的异常。
- raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
Python traceback模块:获取异常信息
在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。
捕获异常时,有2种方式可获得更多的异常信息,分别是:
- 使用sys模块中的exc_info方法;
- 使用traceback模块中的相关函数。
使用traceback模块查看异常传播轨迹,首先需要将traceback模块引入,该模块提供了如下两个常用方法:
- traceback.print_exc():将异常传播轨迹信息输出到控制台或指定文件中。
- format_exc():返回一个字符串而不是打印到文件。
traceback.print_exc()将异常信息打印出来但无法保存



