Python笔记1.1(字符串日期转换、argparse、sys、overwrite、eval、json.dumpsloads、os.system(cmd)、zfill、endswith、深浅拷贝)
Python笔记2(函数参数、面向对象、装饰器、高级函数、捕获异常、dir)
Python笔记1.2
- 13、with open() as file和open()参数详解
- 14、logging
- 日志的等级
- logging.basicConfig(\*kwargs)
- format
- 15、os、shutil、glob
- os
- shutil
- glob
- 查找指定的文件
- 查找含有指定文件的内容
- 批量修改目录中的文件名称
- 批量查找并复制备份py脚本
- 16、decode和encode
13、with open() as file和open()参数详解
with open() as file:
是 Python 中用于打开文件的语法结构。
with
和as
是 Python 的关键字,用于创建一个上下文环境,确保在离开该环境时资源能够被正确关闭或释放。open()
是一个内置函数,用于打开文件并返回一个文件对象。
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open()
函数的各个参数的详细解释:
-
file
:要打开的文件名(或文件路径)。可以是相对路径或绝对路径。 -
mode
(可选):打开文件的模式。它是一个字符串参数,默认值为'r'
(只读模式)。常用的打开模式包括:'r'
:只读模式。文件从开头位置开始读取,默认模式。'w'
:写入模式。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件进行写入。'x'
:独占创建模式。只写模式,用于创建新文件。如果文件已存在,则抛出FileExistsError
异常。'a'
:追加模式。文件从末尾位置开始写入,如果文件不存在,则创建新文件。'b'
:二进制模式。以二进制形式读取或写入文件,用于处理非文本文件。't'
:文本模式(默认)。以文本形式读取或写入文件,用于处理文本文件。
-
buffering
(可选):指定文件的缓冲策略。可以为整数值来指定缓冲区大小,或者使用-1
(默认值)来选择默认的缓冲机制。 -
encoding
(可选):指定文件的编码格式。例如,'utf-8'
、'latin-1'
等。如果不指定该参数,在文本模式下将使用系统默认编码。 -
errors
(可选):指定编解码错误的处理方式。默认值为None
,表示使用默认的错误处理机制。 -
newline
(可选):指定用于文本模式下换行符的转换方式。可以是None
(默认值,保持系统默认),''
(不进行转换),'\n'
(将换行符转换为\n
),'\r'
(将换行符转换为\r
)等。 -
closefd
(可选):定义当文件对象关闭时是否关闭与文件描述符相关的底层文件。默认值为True
,表示关闭文件。 -
opener
(可选):用于自定义打开文件的底层实现的函数。
读写
# 1. 打开⽂件 f:file文件的缩写
f = open('test.txt', 'w')
# 2.⽂件写⼊
f.write('hello world')
# 3. 关闭⽂件
f.close()
- writelines():写入的必须是列表类型。
- readlines():可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
- readline():一次读取一行内容。
14、logging
日志的等级
日志级别 | 使用场景 |
---|---|
DEBUG | 用于调试阶段,输出详细的调试信息,通常不会在生产环境中使用 |
INFO | 用于输出程序运行的一般信息,例如程序启动、停止等 |
WARNING | 用于输出警告信息,例如程序运行时出现了一些不严重的问题,但需要引起注意 |
ERROR | 用于输出错误信息,例如程序运行时出现了一些严重的问题,需要及时处理 |
CRITICAL | 用于输出严重的错误信息,例如程序崩溃、系统崩溃等,需要立即处理 |
logging.basicConfig(*kwargs)
参数名称 | 描述 |
---|---|
filename | 指定日志输出目标文件的文件名,指定该参数后日志信息就不会输出到控制台上 |
filemode | 指定日志文件的打开模式,默认为’a’.需要注意的是,该选项要在filename被指定时才有效 |
format | 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序 |
datefmt | 指定日志记录中日期和时间的格式,该选项要在format中包含时间字段%(asctime)s时才有效 |
level | 指定日志器的日志级别,小于该级别将不会输出 |
stream | 指定日志输出目标stream,如sys.stdout、sys.stderr以及网络stream。需要说明的是,stream和filename不能同时提供,否则会引发 ValueError异常 |
style | 指定format格式字符串的风格,可取值为’%‘、’{‘和’$‘,默认为’%’ |
format
字段/属性名称 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志事件发生的事时间 |
levelname | %(levelname)s | 该日志记录的文字形式的日志级别(‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’) |
message | %(message)s | 日志记录的文本内容,通过 msg % args计算得到的 |
pathname | %(pathname)s | 调用日志记录函数的源码文件的全路径 |
filename | %(filename)s | pathname的文件名部分,包含文件后缀 |
module | %(module)s | filename的名称部分,不包含后缀 |
lineno | %(lineno)d | 调用日志记录函数的源代码所在的行号 |
funcName | %(funcName)s | 调用日志记录函数的函数名 |
import logging
# 1、创建一个logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 2、创建一个handler,用于写入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 3、定义handler的输出格式(formatter)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 4、给handler添加formatter
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 5、给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
15、os、shutil、glob
os
返回上一层路径
os.path.abspath(os.path.join(path, os.paridr))
shutil
glob
查找指定的文件
想查找的文件名已知道,但目录在哪里不知道
# coding:utf-8
import glob
path = glob.os.path.join(glob.os.getcwd(), '*')
# 获取当前路径下所有内容
# 判断每个内容的类型(文件夹还是文件)
# 递归
final_result = []
def search(path, target):
result = glob.glob(path)
for data in result:
if glob.os.path.isdir(data):
_path = glob.os.path.join(data, '*')
search(_path, target)
else:
if target in data:
final_result.append(data)
return final_result
# /home/test1.py if test1 in /test1/abc.py
if __name__ == '__main__':
result = search(path, target='test1')
print(result)
查找含有指定文件的内容
文件中包含某些关键字,但不知道文件名和所在路径
# coding:utf-8
import glob
path = glob.os.path.join(glob.os.getcwd(), '*')
# 获取当前路径下所有内容
# 判断每个内容的类型(文件夹还是文件)
# 递归
final_result = []
def search(path, target):
result = glob.glob(path)
for data in result:
if glob.os.path.isdir(data):
_path = glob.os.path.join(data, '*')
print('path is %s' % _path)
search(_path, target)
else:
f = open(data, 'r')
try:
content = f.read()
if target in content:
final_result.append(data)
except:
print('data read failed: %s' % data)
continue
finally:
f.close()
return final_result
if __name__ == '__main__':
result = search(path, target='dewei')
print(result)
批量修改目录中的文件名称
知道文件名需要修改的字符串
# coding:utf-8
import glob
import shutil
def update_name(path):
result = glob.glob(path)
for index, data in enumerate(result):
if glob.os.path.isdir(data):
_path = glob.os.path.join(data, '*')
update_name(_path)
else:
path_list = glob.os.path.split(data)
# [/home/xxxx, name.txt]
name = path_list[-1]
new_name = '%s_%s' % (index, name) # '0_name.txt'
new_data = glob.os.path.join(path_list[0], new_name)
shutil.move(data, new_data)
if __name__ == '__main__':
path = glob.os.path.join(glob.os.getcwd(), '*')
update_name(path)
批量查找并复制备份py脚本
import os
import shutil
import datetime
ymd = datetime.datetime.now().strftime("%Y%m%d")
# 工作目录路径
work_dir = os.getcwd()
# 递归遍历所有子目录,查找Python程序文件
for foldername, subfolders, filenames in os.walk(work_dir):
for filename in filenames:
if filename.endswith('.py'):
path_py = os.path.join(foldername, filename)
print(os.path.join(foldername, filename))
new_path = os.path.join(r"D:\beifen\py_{}\{}".format(ymd, path_py.split('Project\\')[1]))
if not os.path.exists(new_path):
os.makedirs(new_path)
if not os.path.exists(r"D:\beifen\py_{}\{}".format(ymd, path_py.split('Project')[1])):
shutil.copy(os.path.join(foldername, filename), new_path)
# exit()
16、decode和encode
在 Python 中,字符串是以 Unicode 编码进行存储和操作的。Unicode 是一种字符集,为每个字符分配了唯一的数字编码,可以用于表示所有的字符集(包括 ASCII,拉丁文和其他字符集)。
在 Python 中,有两种主要的方法来将字符串转换为字节序列(编码)或将字节序列转换为字符串(解码):.encode()
和 .decode()
。
.encode()
方法将字符串转换为字节序列,方法调用需要指定要使用的编码方式。例如,.encode('utf-8')
将字符串编码为以 UTF-8 编码的字节序列。返回一个 bytes
对象。
示例:
string = '这是一段中文字符'
encoded_string = string.encode('utf-8')
print(encoded_string)
输出:b'\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe6\xae\xb5\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6'
.decode()
方法将字节序列转换为字符串,调用需要指定要使用的编码方式。例如,.decode('utf-8')
将以 UTF-8 编码的字节序列转换为字符串。返回一个字符串。
示例:
bytes_string = b'\xe8\xbf\x99\xe6\x98\xaf\xe4\xb8\x80\xe6\xae\xb5\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6'
decoded_string = bytes_string.decode('utf-8')
print(decoded_string)
输出:这是一段中文字符
需要注意的是,调用 .encode()
或 .decode()
时需要指定相应的编码方式。不同的编码方式可能在字符编码转换上存在差异,使用不当可能导致数据损坏或解码错误。
另外,Python 中的 .encode()
和 .decode()
方法只适用于 Python 字符串和字节序列之间的转换。如果要进行文件读写等操作,需要使用相应的文件读写方法。例如使用 open()
函数时,需要指定相应的模式。例如 open('file.txt', 'w', encoding='utf-8')
表示使用 UTF-8 编码打开文件以进行写操作。