python提升九
Python logging模块简单用法
logging 模块可以很容易地创建自定义的消息记录,这些日志消息将描述程序执行何时到达日志函数调用,并列出指定的任何变量当时的值。
启用 logging 模块很简单,直接将下面的代码复制到程序开头:
1 | import logging |
当 Python 记录一个事件的日志时,它会创建一个 LogRecord 对象,保存关于该事件的信息。
1 | import logging |
通过 logging.debug() 函数可以打印日志信息,这个 debug() 函数将调用 basicConfig() 打印一行信息,这行信息的格式是在 basicConfig() 函数中指定的,并且包括传递给 debug() 的消息。
Python logging日志级别
“日志级别”提供了一种方式,按重要性对日志消息进行分类。5 个日志级别如图所示,从最不重要到最重要。利用不同的日志函数,消息可以按某个级别记入日志。
日志级别的好处在于,我们可以改变想看到的日志消息的优先级。比如说,向 basicConfig() 函数传入 logging.DEBUG 作为 level 关键字参数,这将显示所有级别为 DEBUG 的日志消息。
当开发了更多的程序后,我们可能只对错误感兴趣,在这种情况下,可以将 basicConfig() 的 level 参数设置为 logging.ERROR,这将只显示 ERROR 和 CRITICAL 消息,跳过 DEBUG、INFO 和 WARNING 消息。
Python logging禁用日志
在调试完程序后,可能并不希望所有这些日志消息出现在屏幕上,这时就可以使用 logging.disable() 函数禁用这些日志消息,从而不必进入到程序中,手工删除所有的日志调用。
logging.disable() 函数的用法是,向其传入一个日志级别,它会禁止该级别以及更低级别的所有日志消息。因此,如果想要禁用所有日志,只要在程序中添加 logging.disable(logging.CRITICAL) 即可,
将日志消息输出到文件中
虽然日志消息很有用,但它们可能塞满屏幕,让你很难读到程序的输出。考虑到这种情况,可以将日志信息写入到文件,既能使屏幕保持干净,又能保存信息,一举两得。
将日志消息输出到文件中的实现方法很简单,只需要设置 logging.basicConfig() 函数中的 filename 关键字参数即可
1 | import logging |
此程序中,将日志消息存储到了 demo.txt 文件中,该文件就位于运行的程序文件所在的目录。
文件路径,Python中如何书写文件路径
路径中的 D:\ 指的是“根文件夹”,它包含了所有其他文件夹。在 Windows 中,根文件夹名为 D:\,也称为 D: 盘
在 Windows 上,路径书写使用反斜杠 “" 作为文件夹之间的分隔符
不仅如此,如果需要创建带有文件名称的文件存储路径,
os.path.join() 函数同样很有用。
下面的例子将一个文件名列表中的名称,添加到文件夹名称的末尾:
1 | import os |
Python绝对路径和相对路径详解
什么是绝对路径与相对路径
明确一个文件所在的路径,有 2 种表示方式,分别是:
绝对路径:总是从根文件夹开始,Window 系统中以盘符(C:、D:)作为根文件夹,而 OS X 或者 Linux 系统中以 / 作为根文件夹。
相对路径:指的是文件相对于当前工作目录所在的位置。例如,当前工作目录为 “C:\Windows\System32”,若文件 demo.txt 就位于这个 System32 文件夹下,则 demo.txt 的相对路径表示为 “.\demo.txt”(其中 .\ 就表示当前所在目录)。
在使用相对路径表示某文件所在的位置时,除了经常使用 .\ 表示当前所在目录之外,还会用到 ..\ 表示当前所在目录的父目录。
Python处理绝对路径和相对路径
Python os.path 模块提供了一些函数,可以实现绝对路径和相对路径之间的转换,以及检查给定的路径是否为绝对路径,比如说:
Python文件基本操作
Python 中,对文件的操作有很多种,常见的操作包括创建、删除、修改权限、读取、写入等
这些操作可大致分为以下 2 类:
删除、修改权限:作用于文件本身,属于系统级操作。
写入、读取:是文件最常用的操作,作用于文件的内容,属于应用级操作。
对文件的系统级操作功能单一,比较容易实现,可以借助 Python 中的专用模块(os、sys 等),并调用模块中的指定函数来实现。
假设如下代码文件的同级目录中有一个文件“a.txt”,通过调用 os 模块中的 remove 函数,可以将该文件删除,具体实现代码如下:
1 | import os |
文件的应用级操作可以分为以下 3 步,每一步都需要借助对应的函数实现:
打开文件:使用 open() 函数,该函数会返回一个文件对象;
对已打开文件做读/写操作:读取文件内容可使用 read()、readline() 以及 readlines() 函数;
向文件中写入内容,可以使用 write() 函数。
关闭文件:完成对文件的读/写操作之后,最后需要关闭文件,可以使用 close() 函数。
Python open()函数详解:打开指定文件
在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。
语法格式:
file = open(file_name [, mode=’r’ [ , buffering=-1 [ , encoding = None ]]])
名称要用引号(单引号或双引号都可以)括起来。
需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可,否则,此参数需要指定打开文件所在的完整路径。
mode:可选参数,用于指定文件的打开模式
如果不写,则默认以只读(r)模式打开文件。
buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区
encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值也不同。
open()是否需要缓冲区
通常情况下、建议大家在使用 open() 函数时打开缓冲区,即不需要修改 buffing 参数的值。
如果 buffing 参数的值为 0(或者 False),则表示在打开指定文件时不使用缓冲区;
如果 buffing 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(单位是字节);
如果 buffing 参数的值为负数,则代表使用默认的缓冲区大小。
因为目前为止计算机内存的 I/O 速度仍远远高于计算机外设(例如键盘、鼠标、硬盘等)的 I/O 速度,如果不使用缓冲区,则程序在执行 I/O 操作时,内存和外设就必须进行同步读写操作,也就是说,内存必须等待外设输入(输出)一个字节之后,才能再次输出(输入)一个字节。这意味着,内存中的程序大部分时间都处于等待状态。
而如果使用缓冲区,则程序在执行输出操作时,会先将所有数据都输出到缓冲区中,然后继续执行其它操作,缓冲区中的数据会有外设自行读取处理;同样,当程序执行输入操作时,会先等外设将数据读入缓冲区中,无需同外设做同步读写操作。
open()文件对象常用的属性
成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:
file.name:返回文件的名称;
file.mode:返回打开文件时,采用的文件打开模式;
file.encoding:返回打开文件时使用的编码格式;
file.closed:判断文件是否己经关闭。
Python read()函数
对于借助 open() 函数,并以可读模式(包括 r、r+、rb、rb+)打开的文件,可以调用 read() 函数逐个字节(或者逐个字符)读取文件中的内容。如果文件是以文本模式(非二进制模式)打开的,则 read() 函数会逐个字符进行读取;
反之,如果文件以二进制模式打开,则 read() 函数会逐个字节进行读取。
语法格式: file.read([size])
file 表示已打开的文件对象;
size 作为一个可选参数,用于指定一次最多可读取的字符(字节)个数,如果省略,则默认一次性读取所有内容。
当然,我们也可以通过使用 size 参数,指定 read() 每次可读取的最大字符(或者字节)数
1 | file = open("aa.txt, encoding= "utf-8") |
但是一般都使用这种方式打开
这样可以不用 关闭操作
1 | with open("aa.txt",encoding="utf-8") as f: |
read()函数抛出UnicodeDecodeError异常的解决方法
在使用 read() 函数时,如果 Python 解释器提示UnicodeDecodeError异常,其原因在于,目标文件使用的编码格式和 open() 函数打开该文件时使用的编码格式不匹配。
举个例子,如果目标文件的编码格式为 GBK 编码,而我们在使用 open() 函数并以文本模式打开该文件时,手动指定 encoding 参数为 UTF-8。这种情况下,由于编码格式不匹配,当我们使用 read() 函数读取目标文件中的数据时,Python 解释器就会提示UnicodeDecodeError异常。
要解决这个问题,要么将 open() 函数中的 encoding 参数值修改为和目标文件相同的编码格式,要么重新生成目标文件(即将该文件的编码格式改为和 open() 函数中的 encoding 参数相同)。
除此之外,还有一种方法:先使用二进制模式读取文件,然后调用 bytes 的 decode() 方法,使用目标文件的编码格式,将读取到的字节串转换成认识的字符串。
eg.
1 | #以二进制形式打开指定文件,该文件编码格式为 utf-8 |
Python readline()和readlines()函数:按行读取文件
这 2 个函数都以“行”作为读取单位,即每次都读取目标文件中的一行。
对于读取以文本格式打开的文件,读取一行很好理解;
对于读取以二进制格式打开的文件,它们会以“\n”作为读取一行的标志。
Python readline()函数
readline() 函数用于读取文件中的一行,包含最后的换行符“\n”。
语法格式:
file.readline([size])
size 为可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数。
Python readlines()函数
readlines() 函数用于读取文件中的所有行,它和调用不指定 size 参数的 read() 函数类似,只不过该函数返回是一个字符串列表,其中每个元素为文件中的一行内容。
语法格式:
file.readlines()