对文件进行重命名、删除等一些操作,在python中可以利用os模块。
os模块提供一些系统级别的操作命令
OS模块简单的来说它是一个Python的系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作。
方法 | 作用 |
---|---|
os.system(“cd e:”) | 运行shell命令,直接显示 |
print(os.environ[‘path’]) | 获取系统环境变量 |
os.name | 字符串指示当前使用平台。win->‘nt’; Linux->‘posix’ |
os.getcwd() | 获取当前工作目录,即当前python脚本工作的目录路径 |
os.chdir(“dirname”) | 改变当前脚本工作目录;相当于shell下cd os.chdir(“d://”) |
os.curdir | 返回当前目录: (’.’) |
os.pardir | 获取当前目录的父目录字符串名:(’…’) |
os.sep | 操作系统特定的路径分隔符,win下为"\",Linux下为"/" |
os.linesep | 当前平台使用的行终止符,win下为"\t\n",Linux下为"\n" |
os.pathsep | 用于分割文件路径的字符串 |
os.makedirs(‘dir1/dir2’) | 可生成多层递归目录 os.makedirs(“notes/note”) |
os.removedirs(‘dirname1’) | 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 os.removedirs(“notes/note”) |
os.mkdir(‘dirname’) | 生成单级目录;相当于shell中mkdir dirname os.mkdir(“notes”) |
os.rmdir(‘dirname’) | 删除单级空目录,若目录不为空则无法删除,报错 os.rmdir(“notes”) |
os.listdir(‘dirname’) | 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.listdir() os.listdir(".") os.listdir(os.curdir) |
os.remove() | 删除一个文件 |
os.rename(“oldname”,“new”) | 重命名文件/目录 |
os.stat(‘path/filename’) | 获取文件/目录信息 |
方法 | 作用 |
---|---|
os.path.abspath(path) | 返回path规范化的绝对路径 |
os.path.isabs(path) | 如果path是绝对路径,返回True |
os.path.split(path) | 将path分割成目录和文件名二元组返回 |
os.path.dirname(path) | 返回path的目录。其实就是os.path.split(path)的第一个元素 |
os.path.basename(path) | 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 |
os.path.exists(path) | 如果path存在,返回True;如果path不存在,返回False |
os.path.isfile(path) | 如果path是一个存在的文件,返回True。否则返回False |
os.path.isdir(path) | 如果path是一个存在的目录,则返回True。否则返回False |
os.path.join(path1[, path2[, …]]) | 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 |
os.path.getatime(path) | 返回path所指向的文件或者目录的最后存取时间 |
os.path.getmtime(path) | 返回path所指向的文件或者目录的最后修改时间 |
os.path.getsize(path) | 返回path所指向的文件的大小,单位是字节 |
rename(需要修改的文件名, 新的文件名)
import os
os.rename("毕业论文.txt", "毕业论文-最终版.txt")
remove(待删除的文件名)
import os
os.remove("毕业论文.txt")
import os
os.mkdir("张三") #只能生成单级目录
os.makedirs('dir1/dir2') #可生成多层递归目录
os.rmdir('dirname') #删除单级空目录,若目录不为空则无法删除,报错
os.removedirs('dirname1') #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
import os
os.listdir("./") #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.path.abspath(path) #返回path规范化的绝对路径
os.path.isabs(path) #如果path是绝对路径,返回True
os.path.split(path) #将path分割成目录和文件名二元组返回
os.path.dirname(path) #返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) #返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False
os.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回False
os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回
path = os.path.join(os.getcwd(),'gl')
os.walk是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
os.walk的函数声明为:
walk(top, topdown=True, οnerrοr=None, followlinks=False)
参数
import os
for root, dirs, files in os.walk(".", topdown=False):
for name in files:
print(os.path.join(root, name))
for name in dirs:
print(os.path.join(root, name))
文件操作一般步骤
打开文件
读/写文件
保存文件
关闭文件
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,
**注意:**使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
常用方式
f = open(file,mode) #打开文件
f.close() #关闭文件
文件找开模式
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
x, 只写模式【不可读;不存在则创建,存在则报错】
a, 追加模式【可读; 不存在则创建;存在则只追加内容】,文件指针自动移到文件尾。
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】,消除文件内容,然后以读写方式打开文件。
x+ ,写读【可读,可写】
a+, 写读【可读,可写】,以读写方式打开文件,并把文件指针移到文件尾。
"b"表示以字节的方式操作,以二进制模式打开文件,而不是以文本模式。
rb 或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
文件内容的读取
read() #一次读取全部的文件内容。
read(num)#读取指定字符个数
readline() #每次读取文件的一行。按行读取,但是一次只读取一行。
readlines() #读取文件的所有行,返回一个字符串列表。按行读取,一次性读取所有内容,返回一个列表,每一行内容作为一个元素。
文件写入
write() #参数就是需要写入的内容
writelines() #可传一个可迭代
# 写模式打开一个test.txt 文件
f = open('test.txt', 'w')
f.writelines(['我','爱','我的','国家']) # writelines 方法将可迭代对象,迭代写入文件
f.close() # 关闭文件
文件定位,指的是当前文件指针读取到的位置,光标位置。在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取
# 以读模式打开test.txt 文件
f = open('test.txt','r’)
content = f.read(3) # 读取三个字符
# 查看当前游标所在位置
cur =f.tell()
print(cur)
content = f.read(3) # 读取三个字符
# 查看当前游标所在位置
cur =f.tell()
print(cur)
如果在操作文件的过程,需要定位到其他位置进行操作,用seek()。
seek(offset, from)有2个参数,offset,偏移量单位字节,负数是往回偏移,正数是往前偏移,from位置:0表示文件开头,1表示当前位置,2表示文件末尾
注意: Python3中取消了当前位置与文末偏移。只能将光标定位到开头,不可往回偏移。 seek 方法在Python3中只能做文件开头往前偏移,或者将光标定位到开头。
f = open("1.txt","r")
f.read(3)
print(f.tell())
f.seek(1,0) #从文件开头往右偏移1位
f.seek(0) #定位到文件开头
print(f.tell())
f.close()
文本文件指针操作
file.seek(offset,whence=0) #从文件中给移动指针,从whence(0起始,1当前,2末尾)偏移offset个字节,正往结束方向移动,负往开始方向移动
file.tell() #返回当前文件中的位置。获得文件指针位置
当你做文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。
正常情况下,代码如下:
file = open("/tmp/foo.txt")
data = file.read()
file.close()
这里有两个问题。
一、是可能忘记关闭文件句柄;
二、是文件读取数据发生异常,没有进行任何处理。
然而with可以很好的处理上下文环境产生的异常。下面是with版本的代码:
with open("/tmp /foo.txt") as file:
data = file.read()
with的基本思想是with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。
#利用脚本完成自动备份,要求用户输入文件名称,完成自动备份
def copyfile():
# 接收用户输入的文件名
old_file = input('请输入要备份的文件名:’)
file_list = old_file.split(".")
# 构造新的文件名,加上备份后缀
new_file = file_list[0] + '_备份.' + file_list[1]
old_f = open(old_file, 'r’) # 打开需要备份的文件
new_f = open(new_file, 'w’) # 以写的模式打开新文件,不存在则创建
content = old_f.read() # 将文件内容读取出来
new_f.write(content) # 将读取的内容写入备份文件
# 将打开的文件关闭
old_f.close()
new_f.close()
copyfile()
#如果处理超大文件,一次将全部内容读取出来显然是不合适的,在需求1的基础上改进下代码,让它备份大文件也不会导致内存被占满。
def copyfile():
# 接收用户输入的文件名
old_file = input('请输入要备份的文件名:’)
# 如果没有输入文件名则打印提示
if not old_file:
print('[ERROR]: 请输入正确的文件路径’)
return file_list = old_file.split(".")
# 构造新的文件名,加上备份后缀
if len(file_list) < 2:
new_file = file_list[0] + '_备份’
else: # 文集名没有后缀的情况
new_file = file_list[0] + '_备份.' + file_list[1]
try:
# 同时打开需要备份的文件,新文件
with open(old_file, 'r') as old_f, open(new_file, 'a') as new_f:
while True:
# 一次读取1024字符
content = old_f.read(1024)
new_f.write(content)
# 当读取的内容字符长度小于1024说明已经读取完毕
if len(content) < 1024:
break
except Exception as e:
print(e)
copyfile()
python 中时间表示方法有:
时间戳,
即从1975年1月1日00:00:00到现在的秒数;格式化后的时间字符串;
时间struct_time 元组。
struct_time元组中元素主要包括tm_year(年)、tm_mon(月)、tm_mday(日)、tm_hour(时)、tm_min(分)、tm_sec(秒)、tm_wday(weekday0 - 6(0表示周日))、tm_yday(一年中的第几天1 - 366)、tm_isdst(是否是夏令时)
方法 | 作用 |
---|---|
time.time(): | 返回当前时间的时间戳。 |
time.localtime([secs]) | 将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。 |
time.gmtime([secs]) | 和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time。 |
time.mktime(t) | 将一个struct_time转化为时间戳。 |
time.sleep(secs): | 线程推迟指定的时间运行。单位为秒。 |
time.strftime(format[, t]): | 把一个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个元素越界,ValueError的错误将会被抛出。 |
time.strptime(string[, format]): | 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。 |
time.asctime([t]): | 把一个表示时间的元组或者struct_time表示为这种形式:‘Sun Jun 20 23:21:05 1993’。如果没有参数,将会将time.localtime()作为参数传入。 |
time.ctime([secs]): | 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。 |
time.clock(): | 这个需要注意,在不同的系统上含义不同。在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间。(实际上是以WIN32上QueryPerformanceCounter()为基础,它比毫秒表示更为精确) |
[外链图片转存失败(img-fTuiU3Yq-1563594859111)(./time.png)]
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
import time
print(time.strftime("%Y/%m/%d %H:%M:%S",time.localtime()))
print(time.ctime())
2019/03/05 00:55:52
Tue Mar 5 00:55:52 2019
dateime是time的升级版,可以对date(日期)、time(时间)、datetime(日期时间)等三种单独管理。主要是由下面四个类组成
datetime模块中包含如下类:
类名 | 功能说明 |
---|---|
date | 日期对象,常用的属性有year, month, day |
time | 时间对象 |
datetime | 日期时间对象,常用的属性有hour, minute, second, microsecond |
datetime_CAPI | 日期时间对象C语言接口 |
timedelta | 时间间隔,即两个时间点之间的长度 |
tzinfo | 时区信息对象 |
>>> a = datetime.date.today()
>>> a
datetime.date(2017, 3, 22)
>>> a.year
2017
>>> a.month
3
>>> a.day
22
1、用于日期比较大小的方法
方法名 | 方法说明 | 用法 |
---|---|---|
__eq__(…) |
等于(x==y) | x.__eq__(y) |
__ge__(…) |
大于等于(x>=y) | x.__ge__(y) |
__gt__(…) |
大于(x>y) | x.__gt__(y) |
__le__(…) |
小于等于(x<=y) | x.__le__(y) |
__lt__(…) |
小于(x | x.__lt__(y) |
__ne__(…) |
不等于(x!=y) | x.__ne__(y) |
以上方法的返回值为True\False
>>> a.strftime("%Y%m%d")
'20170322'
>>> a.__str__() #如果只是相简单的获得日期的字符串,则使用__str__(...)
'2017-03-22'
>>> a.ctime() #如果想要获得ctime样式的格式请使用ctime(...)
'Wed Mar 22 00:00:00 2017'
time
类由hour
小时、minute
分钟、second
秒、microsecond
毫秒和tzinfo
五部分组成
>>> a = datetime.time(12,20,59,899)
>>> a
datetime.time(12, 20, 59, 899)
>>> a.hour
12
>>> a.minute
20
>>> a.second
59
>>> a.microsecond
899
>>> a.tzinfo
>>> a.__getattribute__('hour')
12
相关方法包括:__eq__(...)
, __ge__(...)
, __gt__(...)
, __le__(...)
, __lt__(...)
, __ne__(...)
这里的方法与date
类中定义的方法大同小异,使用方法与一样,这里就不过多介绍了,示例如下:
>>> a = datetime.time(12,20,59,899)
>>> a.strftime('%H:%M:%S')
'12:20:59'
>>> a = datetime.time(12,20,59,899)
>>> a.__str__()
'12:20:59.000899'
datetime
类其实是可以看做是date
类和time
类的合体,其大部分的方法和属性都继承于这二个类,相关的操作方法请参阅,本文上面关于二个类的介绍。其数据构成也是由这二个类所有的属性所组成的。
>>> a = datetime.datetime.now()
>>> a
datetime.datetime(2017, 3, 22, 16, 9, 33, 494248)
>>> a.date()
datetime.date(2017, 3, 22)
>>> a.time()
datetime.time(16, 9, 33, 494248)
>>> datetime.datetime.strptime('2017-3-22 15:25','%Y-%m-%d %H:%M')
datetime.datetime(2017, 3, 22, 15, 25)
timedelta
类是用来计算二个datetime
对象的差值的。
此类中包含如下属性:
1、days:天数
2、microseconds:微秒数(>=0 并且 <1秒)
3、seconds:秒数(>=0 并且 <1天)
计算当前时间向后8个小时的时间
>>> d1 = datetime.datetime.now()
>>> d2 = d1 + datetime.timedelta(hours = 8)
>>> d2
datetime.datetime(2017, 3, 23, 1, 10, 37, 182240)
可以计算: 天(days), 小时(hours), 分钟(minutes), 秒(seconds), 微秒(microseconds).
计算上周一和周日的日期
today = datetime.date.today()
>>> today
datetime.date(2017, 3, 23)
>>> today_weekday = today.isoweekday()
>>> last_sunday = today - datetime.timedelta(days=today_weekday)
>>> last_monday = last_sunday - datetime.timedelta(days=6)
>>> last_sunday
datetime.date(2017, 3, 19)
>>> last_monday
datetime.date(2017, 3, 13)
计算三小时前的时间
print(datetime.datetime.now()-datetime.timedelta(hours=3))
方法 | 作用 |
---|---|
random.random () | 随机产生[0, 1)之间的浮点数 |
random.uniform(1.3,5.8) | 随机产生[a, b)之间的浮点数, 区间端点可以不是整数 |
random.randint(1,6) | 随机产生[a, b]之间的整数(包含a和b) |
random.randrange(0,10,2) | 随机产生指定范围[start, stop, step)的一个整数 |
random.choice(seq_list) | 序列选择(返回元素)—从序列中随机选取一个元素 |
random.choices(population, weights=None, *, cum_weights=None, k=1) | # 3.6版本新增。从population集群中随机抽取K个元素(可重复)。weights是相对权重列表,cum_weights是累计权重,两个参数不能同时存在。 |
random.sample(seq_list, 4) | 序列节选(返回序列)—从序列中随机选取指定个数的元素 |
random.shuffle(seq_list) | 列表打乱(无返回值)—将指定列表打乱 |
用random.random()写出10-100的随机数
Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据
加密算法
md5(), sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), blake2s(),
sha3_224, sha3_256, sha3_384, sha3_512, shake_128, and shake_256.
hash对象方法
- update(arg): 更新加密的密文,得到的密文与原来的密文不相同。
- digest(): 获取加密的密文,二进制,无参数。
- hexdigest(): 获取加密的密文,16进制,无参数。
- copy(): 复制一份当前创建的hash对象,无参数。
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9'
#注意 update方法必须 要传二进制数据
>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
hash = hashlib.md5()#md5对象,md5不能反解,但是加密是固定的,就是关系是一一对应,所以有缺陷,可以被对撞出来
hash.update(bytes('admin',encoding='utf-8'))#要对哪个字符串进行加密,就放这里
print(hash.hexdigest())#拿到加密字符串
print(hashlib.md5(b"Nobody inspects the spammish repetition").hexdigest())
m = hashlib.md5()
m.update(b"Nobody inspects the spammish repetition")
print(m.hexdigest())
转码方式
bytes('admin',encoding='utf-8')
"admin".encode("utf-8")
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。
JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
JSON 语法是 JavaScript 对象表示法语法的子集。
JSON 数据类型可以是:
在python中,有专门处理json格式的模块—— json 模块
Json 模块提供了四个方法: dumps、dump、loads、load
dumps和dump 序列化方法
dumps只完成了序列化为str,
dump必须传文件描述符,将序列化的str保存到文件中
python对象中有中文的,需要指定参数 ensure_ascii=True #中文需改为False,
###dumps()用法
dict = {"name":"Tom", "age":23,"gender":"男"}
json.dumps(dict,ensure_ascii=False) # #中文需改为False,
#结果:
#'{"name": "Tom", "age": 23}'
#ensure_ascii=True #中文需改为False,
###dump()用法
a = {"name":"Tom", "age":23}
with open("test.json", "w", encoding='utf-8') as f:
# indent 超级好用,格式化保存字典,默认为None,小于0为零个空格
f.write(json.dumps(a, indent=4)) #格式化写入文件利用 indent = 4
# json.dump(a,f,indent=4) # 和上面的效果一样
loads和load 反序列化方法
loads 只完成了反序列化,
load 只接收文件描述符,完成了读取文件和反序列化
json.loads()无法解析单引号字符串
#在使用json.loads()前使用eval()和json.dumps()进行处理
b = "{'name':'Tom', 'age':23}"
d = json.loads(json.dumps(eval(b)))
d = eval(b)
import json
###loads()用法
json.loads('{"name":"Tom", "age":23}')
#结果
#{'age': 23, 'name': 'Tom'}
with open("test.json", "r", encoding='utf-8') as f:
aa = json.loads(f.read()) #第一种写法loads()
f.seek(0) #将文件指针移动到文件开头
bb = json.load(f) # 与 json.loads(f.read())
print(aa)
print(bb)
# 输出:
{'name': 'Tom', 'age': 23}
{'name': 'Tom', 'age': 23}
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
CSV(Comma-Separated Values)即逗号分隔值,可以用Excel打开查看。由于是纯文本,任何编辑器也都可打开。与Excel文件不同,CSV文件中:
在CSV文件中,以,
作为分隔符,分隔两个单元格。像这样a,,c
表示单元格a
和单元格c
之间有个空白的单元格。依此类推。
不是每个逗号都表示单元格之间的分界。所以即使CSV是纯文本文件,也坚持使用专门的模块进行处理。Python内置了csv模块。
import csv
filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename,'r') as f:
reader = csv.reader(f)
print(list(reader))
前面的数字是行号,从1开始,可以用reader.line_num
获取。
要注意的是,reader只能被遍历一次。由于reader是可迭代对象,可以使用next
方法一次获取一行。
import csv
filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename,'r') as f:
reader = csv.reader(f)
# 读取一行,下面的reader中已经没有该行了
head_row = next(reader)
for row in reader:
# 行号从2开始
print(reader.line_num, row)
有reader可以读取,当然也有writer可以写入。一次写入一行,一次写入多行都可以。
import csv
# 使用数字和字符串的数字都可以
datas = [['name', 'age'],
['Bob', 14],
['Tom', 23],
['Jerry', '18']]
with open('example.csv', 'w', newline='') as f:
writer = csv.writer(f)
for row in datas:
writer.writerow(row)
# 还可以写入多行
writer.writerows(datas)
如果不指定newline=''
,则每写入一行将有一空行被写入。上面的代码生成如下内容。
使用DictReader可以像操作字典那样获取数据,把表的第一行(一般是标头)作为key。可访问每一行中那个某个key对应的数据。
import csv
filename = 'F:/Jupyter Notebook/matplotlib_pygal_csv_json/sitka_weather_2014.csv'
with open(filename,'r') as f:
reader = csv.DictReader(f)
for row in reader:
# Max TemperatureF是表第一行的某个数据,作为key
max_temp = row['Max TemperatureF']
print(max_temp)
使用DictWriter类,可以写入字典形式的数据,同样键也是标头(表格第一行)
import csv
headers = ['name', 'age']
datas = [{'name':'Bob', 'age':23},
{'name':'Jerry', 'age':44},
{'name':'Tom', 'age':15}
]
with open('example.csv', 'w', newline='') as f:
# 标头在这里传入,作为第一行数据
writer = csv.DictWriter(f, fieldnames=headers)
writer.writeheader()
for row in datas:
writer.writerow(row)
# 还可以写入多行
writer.writerows(datas)
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
配置logging基本的设置,然后在控制台输出日志,
import logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 设置的info 级别 只会显示大于等于INFO级别的日志
logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
运行结果
2019-04-04 15:35:04,683 - root - INFO - info
2019-04-04 15:35:04,684 - root - WARNING - warning
2019-04-04 15:35:04,684 - root - ERROR - error
2019-04-04 15:35:04,684 - root - CRITICAL - critical
默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。
为了实现在不同的环境记录不同详细程度的日志,这就需要用到日志等级了。
日志等级 | 描述 |
---|---|
DEBUG | 最详细的日志信息,通常出现在问题诊断 |
INFO | 通常只记录关键节点信息,用于确认一切按预期运行 |
WARNING | 一些意想不到的事情发生时记录的信息,但此应用程序还能正常运行。 |
ERROR | 一个更严重的问题导致某些功能不能正常运行时记录的信息 |
CRITICAL | 一个严重的错误导致应用程序无法继续运行时记录的信息 |
参数 | 描述 |
---|---|
level | 指定日志级别。 |
format | 指定日志格式字符串,即指定日志输出时所包含的字段信息以及它们的顺序。 |
datefmt | 指定日期、时间格式,默认:datefmt="%Y-%m-%d %H:%M:%S"。 |
filename | 指定日志输出目标文件的文件名,指定该设置项后日志信息就不会被输出到控制台了。 |
filemode | 指定日志文件打开模式,默认为’a’。该选项在filename指定时才有效。 |
stream | 指定日志输出目标stream,如sys.stdout、sys.stderr。需要注意stream和filename不能同时出现,否则会引发ValueError异常。 |
style | 指定format格式字符串的风格,可取值为’%’、’{‘和’$’,默认为’%’ |
字段名称 | 使用格式 | 描述 |
---|---|---|
asctime | %(asctime)s | 日志事件发生的时间,默认如:2018-05-04 21:48:05,956。 |
created | %(created)f | 日志事件发生的时间–时间戳,就是当时调用time.time()函数返回的值。 |
msecs | %(msecs)d | 日志事件发生事件的毫秒部分 |
levelname | %(levelname)s | 该日志记录的文字形式的日志级(‘DEBUG’, ‘INFO’, ‘WARNING’, ‘ERROR’, ‘CRITICAL’)。 |
levelno | %(levelno)s | 该日志记录的数字形式的日志级别。 |
name | %(name)s | 所使用的日志器名称,默认是’root’,因为默认使用的是rootLogger。 |
message | %(message)s | 日志记录的文本内容。 |
pathname | %(pathname)s | 调用日志记录函数的源码文件的全路径。 |
filename | %(filename)s | pathname的文件名部分,包含文件后缀。 |
module | %(module)s | filename的名称部分,不包含后缀。 |
lineno | %(lineno)d | 调用日志记录函数的源代码所在的行号。 |
funcName | %(funcName)s | 调用日志记录函数的函数名。 |
process | %(process)d | 进程ID。 |
processName | %(processName)s | 进程名称 |
thread | %(thread)d | 线程ID。 |
threadName | %(thread)s | 线程名称。 |
import logging
logging.basicConfig(level=logging.DEBUG,filename="file.log",format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 输出 到文件
logger = logging.getLogger()
console = logging.StreamHandler() # 输出到控制台
console.setLevel(logging.INFO) # 等级为 INFO
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(formatter)
logger.addHandler(console)
logging.debug("debug")
logging.info("info")
logging.warning("warning")
logging.error("error")
logging.critical("critical")
控制台输出
C:\Python36\python.exe D:/test.py
root : INFO info
root : WARNING warning
root : ERROR error
root : CRITICAL critical
文件输出
2019-04-04 15:45:41,817 - root - DEBUG - debug
2019-04-04 15:45:41,817 - root - INFO - info
2019-04-04 15:45:41,817 - root - WARNING - warning
2019-04-04 15:45:41,817 - root - ERROR - error
2019-04-04 15:45:41,817 - root - CRITICAL - critical
logging.getLogger([name])
:返回一个logger对象,如果没有指定名字将返回root logger
logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()
:设定root logger的日志级别
logging.basicConfig()
:用默认Formatter为日志系统建立一个StreamHandler,设置基础配置并加到root logger中
每个程序在输出信息之前都要获得一个Logger。Logger通常对应了程序的模块名,比如聊天工具的图形界面模块可以这样获得它的Logger:
gui=logging.getLogger(”chat.gui”)
而核心模块可以这样:
kernel=logging.getLogger(”chat.kernel”)
logging模块的四大组件
组件名称 | 对应类名 | 描述 |
---|---|---|
日志器 | Logger | 提供了应用程序可一直使用的接口。 |
处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出。 |
过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录。 |
格式器 | Formatter | 决定日志记录的最终输出格式。 |
Logger对象常用方法
方法 | 描述 |
---|---|
Logger.setLevel() | 设置日志器将会处理的日志消息的最低严重级别。 |
Logger.addHandler() | 为该logger对象添加handler对象。 |
Logger.removeHandler() | 为该logger对象移除handler对象。 |
Logger.addFilter() | 为该logger对象添加filter对象。 |
Logger.removeFilter() | 为该logger对象移除个filter对象。 |
怎样得到一个Logger对象呢?
通常用: logger = logging.getLogger()
logging.getLogger()
方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则其值为’root’。
name相同:只要logging.getLogger(name)
中name
相同,则返回的Logger实例就是同一个,最后logger的输出遵从后来设置的日志级别。
Handler对象常用方法
方法 | 描述 |
---|---|
Handler.setLevel() | 设置handler将会处理的日志消息的最低严重级别。 |
Handler.setFormatter() | 为handler设置一个格式器对象。 |
Handler.addFilter() | 为handler添加一个过滤器对象。 |
Handler.removeFilter() | 为handler删除一个过滤器对象。 |
一些常用的Handler子类
Handler | 描述 |
---|---|
logging.StreamHandler | 将日志消息发送到Stream。 |
logging.FileHandler | 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长。 |
logging.handlers.RotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按大小切割。 |
logging.hanlders.TimedRotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按时间切割。 |
logging.handlers.HTTPHandler | 将日志消息以GET或POST的方式发送给一个HTTP服务器。 |
logging.handlers.SMTPHandler | 将日志消息发送给一个指定的email地址。 |
|
| ---------------------- | --------------------------------------------- |
| Handler.setLevel() | 设置handler将会处理的日志消息的最低严重级别。 |
| Handler.setFormatter() | 为handler设置一个格式器对象。 |
| Handler.addFilter() | 为handler添加一个过滤器对象。 |
| Handler.removeFilter() | 为handler删除一个过滤器对象。 |
一些常用的Handler子类
Handler | 描述 |
---|---|
logging.StreamHandler | 将日志消息发送到Stream。 |
logging.FileHandler | 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长。 |
logging.handlers.RotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按大小切割。 |
logging.hanlders.TimedRotatingFileHandler | 将日志消息发送到磁盘文件,并支持日志文件按时间切割。 |
logging.handlers.HTTPHandler | 将日志消息以GET或POST的方式发送给一个HTTP服务器。 |
logging.handlers.SMTPHandler | 将日志消息发送给一个指定的email地址。 |