Python常用模块

参考Python标准库:Python 标准库 — Python 3.12.0 文档

calendar

星期一是默认的每周第一天,星期天是默认的最后一天。更改设置需调用calendar.setfirstweekday()函数。模块包含了以下内置函数:

1calendar.calendar(year,w=2,l=1,c=6)
返回一个多行字符串格式的year年年历,3个月一行,间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。
2calendar.firstweekday( )
返回当前每周起始日期的设置。默认情况下,首次载入caendar模块时返回0,即星期一。
3calendar.isleap(year)

是闰年返回 True,否则为 False。

>>> import calendar
>>> print(calendar.isleap(2000))
True
>>> print(calendar.isleap(1900))
False
4calendar.leapdays(y1,y2)
返回在Y1,Y2两年之间的闰年总数。
5calendar.month(year,month,w=2,l=1)
返回一个多行字符串格式的year年month月日历,两行标题,一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。
6calendar.monthcalendar(year,month)
返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示,从1开始。
7calendar.monthrange(year,month)
返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从1到12。
8calendar.prcal(year,w=2,l=1,c=6)
相当于 print calendar.calendar(year,w,l,c).
9calendar.prmonth(year,month,w=2,l=1)
相当于 print calendar.calendar(year,w,l,c)。
10calendar.setfirstweekday(weekday)
设置每周的起始日期码。0(星期一)到6(星期日)。
11calendar.timegm(tupletime)
和time.gmtime相反:接受一个时间元组形式,返回该时刻的时间戳(1970纪元后经过的浮点秒数)。
12calendar.weekday(year,month,day)
返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。

csv

csv模块实现了 CSV 格式表单数据的读写,csv 模块中的 reader 类和 writer 类可用于读写序列化的数据。也可使用 DictReader 类和 DictWriter 类以字典的形式读写数据。

参考文档:csv --- CSV 文件读写 — Python 3.12.0 文档

详细介绍下DictReader 类和DictWriter 类:

1. class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

创建一个对象,该对象在操作上类似于常规 reader,但是将每行中的信息映射到一个 dict,该 dict 的键由 fieldnames 可选参数给出。

fieldnames 参数是一个 sequence,如果省略 fieldnames,则文件 f 第一行中的值将用作字段名。无论字段名是如何确定的,字典都将保留其原始顺序。

如果某一行中的字段多于字段名,则剩余数据会被放入一个列表,并与 restkey 所指定的字段名 (默认为 None) 一起保存。 如果某个非空白行的字段少于字段名,则缺失的值会使用 restval 的值来填充 (默认为 None)。

所有其他可选或关键字参数都传递给底层的 reader 实例。

def csv_reader(file_path, encode='utf-8', dequto=False):
    with open(file_path, newline='', encoding=encode) as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            if dequto:
                yield {k.replace("\"", ""):row[k].replace("\"", "") for k in row}
            else:
                yield row

2. class csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)

创建一个对象,该对象在操作上类似常规 writer,但会将字典映射到输出行。 fieldnames 参数是由键组成的 序列,它指定字典中值的顺序,这些值会按指定顺序传递给 writerow() 方法并写入文件 f。 如果字典缺少 fieldnames 中的键,则可选参数 restval 用于指定要写入的值。 如果传递给 writerow() 方法的字典的某些键在 fieldnames 中找不到,则可选参数 extrasaction 用于指定要执行的操作。 如果将其设置为默认值 'raise',则会引发 ValueError。 如果将其设置为 'ignore',则字典中的其他键值将被忽略。 所有其他可选或关键字参数都传递给底层的 writer 实例。

注意,与 DictReader 类不同,DictWriter 类的 fieldnames 参数不是可选参数。

def csv_writer(file_path, fieldnames, cache=False):
    with open(file_path, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        if cache:
            w_list = []
            while True:
                row = yield
                if row != 'flush':
                    w_list.append(row)
                if row == 'flush' or len(w_list) >= 5000:
                    w_list = sorted(w_list, key=lambda x: int(x['id']))
                    if row == 'flush':
                        op = w_list
                    else:
                        op = w_list[:2500]
                        w_list = w_list[2500:]
                    for w in op:
                        writer.writerow({key: w.get(key, '') for key in fieldnames})
        else:
            while True:
                row = yield
                writer.writerow({key: row[key] for key in fieldnames})

json

  JSON用来存储和交换文本信息,是一种轻量级的文本数据交换格式,比xml更小/更快/更易解析,易于读写,占用带宽小,网络传输速度快,适用于数据量大,不要求保留原有类型的情况。

  一种简单的方式是使用模块json来存储数据,模块json让你能够将简单的Python数据转存在文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json在Python程序之间分享数据。

    JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见的格式,被包括Python在内的众多语言采用。

json举例:

①{"firstName":"John","lastName":"Doe"}

②{

"employees":[

        {"firstName":"John","lastName":"Doe"},

        {"firstName":"Anna","lastName":"Smith"},

        {"firstName":"Peter","lastName":"Jones"}

]

}

employees[0].lastName = "";

③{

"errorCode":"OK",

"data":{
        "id":"123",

        "name":"test"

}

"cost":1555

}

数据类型转换

将数据从python转换到json格式,在数据类型上会有变化。

Python对象JSON
dictobject
list, tuplearray  []
strstring
int, floatnumber
Truetrue
Falsefalse
Nonenull

dump

由python对象格式化成为json字符串。

json.dump(objfp*skipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=Truecls=Noneindent=Noneseparators=Nonedefault=Nonesort_keys=False**kw)

json.dumps(obj*skipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=Truecls=Noneindent=Noneseparators=Nonedefault=Nonesort_keys=False**kw)

简单来说:

json.dump(obj,fp)将python数据类型(字典、列表...)转换并保存到json格式的文件内,接受两个实参:要存储的数据以及可用于存储数据的文件对象。
json.dumps(obj)将python数据类型转换为json格式的字符串。
import json
numbers = [2,3,5,7,11,13]
print(type(numbers)) # <class 'list'>
jsonstr = json.dumps(numbers)
print(jsonstr) # [2, 3, 5, 7, 11, 13]
print(type(jsonstr)) # <class 'str'>

filename = 'numbers.json'
with open(filename,'w') as f_obj:
    json.dump(numbers,f_obj)
#结果:在当前py文件下面会生成numbers,json文件

load

使用json字符串生成python对象。

json.load(fp*cls=Noneobject_hook=Noneparse_float=Noneparse_int=Noneparse_constant=Noneobject_pairs_hook=None**kw)

json.loads(s*cls=Noneobject_hook=Noneparse_float=Noneparse_int=Noneparse_constant=Noneobject_pairs_hook=None**kw)

json.load(fp)从json格式的文件中读取数据并转换为python类型。
json.loads(s)将json格式的字符串转换为python的类型。
import json
filename = 'numbers.json'
with open(filename) as f_obj:
    #加载存储在numbers.json中的信息,并将其存储在变量numbers中
    numbers = json.load(f_obj)
print(numbers) # [2, 3, 5, 7, 11, 13]

import json
str = '{"name":"Anna","age":16,"tel":["1345525533","58421"]}'
pythonObj = json.loads(str)
print(pythonObj) # {'tel': ['1345525533', '58421'], 'age': 16, 'name': 'Anna'}
print(type(pythonObj)) # <class 'dict'>

JSON 中的键-值对中的键永远是 str 类型的。当一个对象被转化为 JSON 时,字典中所有的键都会被强制转换为字符串。这所造成的结果是字典被转换为 JSON 然后转换回字典时可能和原来的不相等。换句话说,如果 x 具有非字符串的键,则有 loads(dumps(x)) != x 、

import json
dict = {"name":"Anna","age":16,"tel":["1345525533","58421"], 12:"Y"}
jsonstr = json.dumps(dict)
print(jsonstr) # {"tel": ["1345525533", "58421"], "age": 16, "12": "Y", "name": "Anna"}
print(json.loads(jsonstr)) # {'age': 16, 'name': 'Anna', '12': 'Y', 'tel': ['1345525533', '58421']}

logging

官方文档:logging --- Python 的日志记录工具 — Python 3.8.17 文档

python的日志记录工具。

日志:

日志功能应以所追踪事件级别或严重性而定。各级别适用性如下(以严重性递增):

级别

何时使用

DEBUG

细节信息,仅当诊断问题时适用。

INFO

确认程序按预期运行

WARNING

表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行

ERROR

由于严重的问题,程序的某些功能已经不能正常执行

CRITICAL

严重的错误,表明程序已不能继续执行

logging模块提供了两种记录日志的方式:

  • 第一种方式是使用logging提供的模块级别的函数
  • 第二种方式是使用Logging日志系统的四大组件

其实,logging所提供的模块级别的日志记录函数也是对logging日志系统相关类的封装而已。

logging模块定义的模块级别的常用函数

函数说明
logging.debug(msg, *args, **kwargs)创建一条严重级别为DEBUG的日志记录,参数名前增加 一个 * 可以接收元组,参数名前增加两个 * 可以接收字典
logging.info(msg, *args, **kwargs)创建一条严重级别为INFO的日志记录
logging.warning(msg, *args, **kwargs)创建一条严重级别为WARNING的日志记录
logging.error(msg, *args, **kwargs)创建一条严重级别为ERROR的日志记录
logging.critical(msg, *args, **kwargs)创建一条严重级别为CRITICAL的日志记录
logging.log(level, *args, **kwargs)创建一条严重级别为level的日志记录
logging.basicConfig(**kwargs)对root logger进行一次性配置

logging模块提供的日志记录函数所使用的日志器设置的日志级别是WARNING,因此只有WARNING级别的日志记录以及大于它的ERRORCRITICAL级别的日志记录才会被被输出,而小于它的DEBUGINFO级别的日志记录会被丢弃。 

其中logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数。

logging模块的四大组件

组件说明
loggers提供应用程序代码直接使用的接口
handlers用于将日志记录发送到指定的目的位置
filters提供更细粒度的日志过滤功能,用于决定哪些日志记录将会被输出(其它的日志记录将会被忽略)
formatters用于控制日志信息的最终输出格式

说明: logging模块提供的模块级别的那些函数实际上也是通过这几个组件的相关实现类来记录日志的,只是在创建这些类的实例时设置了一些默认值。

os

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值