Python logging模块简单用法

logging 模块可以很容易地创建自定义的消息记录,这些日志消息将描述程序执行何时到达日志函数调用,并列出指定的任何变量当时的值。

启用 logging 模块很简单,直接将下面的代码复制到程序开头:

1
2
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')

当 Python 记录一个事件的日志时,它会创建一个 LogRecord 对象,保存关于该事件的信息。

1
2
3
4
import logging
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
for i in range(0,5):
logging.debug('i is ' + str(i))

通过 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
2
3
4
import logging
logging.basicConfig(filename="aa.txt",level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')
for i in range(0,5):
logging.debug('i is ' + str(i))

此程序中,将日志消息存储到了 demo.txt 文件中,该文件就位于运行的程序文件所在的目录。

文件路径,Python中如何书写文件路径

路径中的 D:\ 指的是“根文件夹”,它包含了所有其他文件夹。在 Windows 中,根文件夹名为 D:\,也称为 D: 盘

在 Windows 上,路径书写使用反斜杠 “" 作为文件夹之间的分隔符

不仅如此,如果需要创建带有文件名称的文件存储路径,
os.path.join() 函数同样很有用。
下面的例子将一个文件名列表中的名称,添加到文件夹名称的末尾:

1
2
3
4
5
6
import os
path = os.getcwd()
lis = ["a.jpg","b.jpg","c.jpg"]
for i in lis:
x = os.path.join(path,i)
print(x)
Python绝对路径和相对路径详解
什么是绝对路径与相对路径

明确一个文件所在的路径,有 2 种表示方式,分别是:
绝对路径:总是从根文件夹开始,Window 系统中以盘符(C:、D:)作为根文件夹,而 OS X 或者 Linux 系统中以 / 作为根文件夹。
相对路径:指的是文件相对于当前工作目录所在的位置。例如,当前工作目录为 “C:\Windows\System32”,若文件 demo.txt 就位于这个 System32 文件夹下,则 demo.txt 的相对路径表示为 “.\demo.txt”(其中 .\ 就表示当前所在目录)。

在使用相对路径表示某文件所在的位置时,除了经常使用 .\ 表示当前所在目录之外,还会用到 ..\ 表示当前所在目录的父目录。

Python处理绝对路径和相对路径

Python os.path 模块提供了一些函数,可以实现绝对路径和相对路径之间的转换,以及检查给定的路径是否为绝对路径,比如说:

os模块

Python文件基本操作

Python 中,对文件的操作有很多种,常见的操作包括创建、删除、修改权限、读取、写入等

这些操作可大致分为以下 2 类:
删除、修改权限:作用于文件本身,属于系统级操作。

写入、读取:是文件最常用的操作,作用于文件的内容,属于应用级操作。

对文件的系统级操作功能单一,比较容易实现,可以借助 Python 中的专用模块(os、sys 等),并调用模块中的指定函数来实现。

假设如下代码文件的同级目录中有一个文件“a.txt”,通过调用 os 模块中的 remove 函数,可以将该文件删除,具体实现代码如下:

1
2
import os
os.remove("a.txt")

文件的应用级操作可以分为以下 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
2
3
file = open("aa.txt, encoding= "utf-8")
print(file.read())
file.close()

但是一般都使用这种方式打开
这样可以不用 关闭操作

1
2
with open("aa.txt",encoding="utf-8") as f:
print(f.read())
read()函数抛出UnicodeDecodeError异常的解决方法

在使用 read() 函数时,如果 Python 解释器提示UnicodeDecodeError异常,其原因在于,目标文件使用的编码格式和 open() 函数打开该文件时使用的编码格式不匹配。
举个例子,如果目标文件的编码格式为 GBK 编码,而我们在使用 open() 函数并以文本模式打开该文件时,手动指定 encoding 参数为 UTF-8。这种情况下,由于编码格式不匹配,当我们使用 read() 函数读取目标文件中的数据时,Python 解释器就会提示UnicodeDecodeError异常。
要解决这个问题,要么将 open() 函数中的 encoding 参数值修改为和目标文件相同的编码格式,要么重新生成目标文件(即将该文件的编码格式改为和 open() 函数中的 encoding 参数相同)。

除此之外,还有一种方法:先使用二进制模式读取文件,然后调用 bytes 的 decode() 方法,使用目标文件的编码格式,将读取到的字节串转换成认识的字符串。
eg.

1
2
3
4
5
6
7
#以二进制形式打开指定文件,该文件编码格式为 utf-8
f = open("aa.txt",'rb+')
byt = f.read()
print(byt)
print("\n转换后:")
print(byt.decode('utf-8'))
f.close()
Python readline()和readlines()函数:按行读取文件

这 2 个函数都以“行”作为读取单位,即每次都读取目标文件中的一行。

对于读取以文本格式打开的文件,读取一行很好理解;

对于读取以二进制格式打开的文件,它们会以“\n”作为读取一行的标志。

Python readline()函数

readline() 函数用于读取文件中的一行,包含最后的换行符“\n”。

语法格式:
file.readline([size])

size 为可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数。

Python readlines()函数

readlines() 函数用于读取文件中的所有行,它和调用不指定 size 参数的 read() 函数类似,只不过该函数返回是一个字符串列表,其中每个元素为文件中的一行内容。

语法格式:
file.readlines()