Python入门教程[7]-常用模块

  • A+
所属分类:python快速入门
摘要python入门教程的最后一篇了,讲一下关于常用的模块,其实模块的使用需要自己去看文档,毕竟模块这么多,不能全部记住。希望大家看完这个入门系列之后可以把python学会,用好!

如果你看到了这里,那么恭喜你啦,这个是python入门教程的最后一篇了。看完这一篇,你就算把python的一些基本的知识都看完了,之后的学习就是多看看代码。

希望这个系列的教程能对你有所帮助。下面就开始具体内容的介绍。

pickle

pickle可以将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输它。

写入方法

  1. f = open('permissionList.pkl', 'wb')
  2. pickle.dump(permissionList, f)

这里注意写入完毕之后需要使用close, 所以完整的步骤如下

  1. f = open('./ProcessData/NSL-KDD_MEAN.pkl', 'wb')
  2. pickle.dump(nsl_kdd_data.dataMean, f)
  3. f.close()

 

读取方法

  1. with open('permissionList.pkl', 'rb') as f:
  2.         permissionList = pickle.load(f)

 

datetime

datetime 模块提供了一些类用于操作日期时间及其相关的计算。比较常用三个类型:

  • date 封装了日期操作
  • datetime 封装日期+时间操作, 这个一定要注意, 有的时候是datetime.datetime, 注意不要少写了.
  • timedelta 表示一个时间间隔,也就是日期时间的差值

下面看一下使用的例子:

  1. from datetime import date,datetime,timedelta
  2. t = datetime.now() #获取现在的时间
  3. >> datetime.datetime(2018, 1, 25, 20, 3, 13, 311169)
  4. datetime.strftime(t,'%Y-%m-%d %H:%M:%S') #把时间转换为字符串
  5. >> '2018-01-25 20:03:13'
  6. datetime.strptime('2018-01-25 20:03:13', '%Y-%m-%d %H:%M:%S') #把字符串转换为时间
  7. >> datetime.datetime(2018, 1, 25, 20, 3, 13)
  8. tnow = t + timedelta(weeks=1,days=0,hours=0,minutes=0)#对时间进行加减运算
  9. datetime.strftime(tnow,'%Y-%m-%d %H:%M:%S')
  10. >> '2018-02-01 20:03:13'

我们也可以获得毫秒级的时间:

  1. t = datetime.now() #获取现在的时间
  2. datetime.strftime(t,'%Y-%m-%d_%H_%M_%S_%f')

我们也可以直接将秒转换为其对应的时间, 这里时间都是从1970年开始的

  1. datetime.datetime.fromtimestamp(1)

上面的结果如下所示, 可以看到结果是1970年1月1日, 1时1秒:

Python入门教程[7]-常用模块

参考资料Python convert seconds to datetime date and time

可以看到这里是从1小时开始计算的, 如果我们只要秒, 我们可以使用上面讲的timedelta减掉一小时.

  1. datetime.datetime.fromtimestamp(1) - datetime.timedelta(hours=1)

上面的结果如下所示:

Python入门教程[7]-常用模块

最后就是将时间转换为小时, 分钟, 秒, 微秒的格式, 这个格式可以用在字幕文件上面.

  1. time = datetime.datetime.fromtimestamp(1) - datetime.timedelta(hours=1)
  2. time.strftime('%H:%M:%S,%f')

最终的结果如下图所示,

Python入门教程[7]-常用模块

因为微秒有6位, 所以要想保留前面3位, 可以使用下面的方式来进行操作.

  1. time.strftime('%H:%M:%S,%f')[:-3]

最终结果如下图所示:

Python入门教程[7]-常用模块

参考资料: Format a datetime into a string with milliseconds

与pandas组合使用

有的时候, 在pandas中的内容都是string格式的, 为了要进行时间的相关操作, 我们需要转换为datetime格式的.

  1. df = pd.read_excel('上班时间.xlsx', encoding='utf-8')
  2. a = pd.to_datetime(df['上班时间'], format="%H:%M:%S")
  3. b = pd.to_datetime(df['下班时间'], format="%H:%M:%S")

这样的数据是Timedelta的数据, 我们可以将其转换为分钟或是小时为单位的数据.

  1. df['minute'] = [times/pd.Timedelta('1 minute') for times in (b-a)]
  2. df['hour'] = [times/pd.Timedelta('1 hour') for times in (b-a)]

 

os

这个模块在文件处理那里也讲过,可以转到那里去看一下,这里就讲一下其他的用法.

创建文件夹

  1. import os
  2. os.getcwd() #获取当前目录
  3. >> '/home/wmn'
  4. os.mkdir('test') #创建文件夹
  5. os.mknod(os.path.join(os.getcwd(),'text.txt'))#在当前目录创建一个text.txt文件

创建文件所在文件夹

下面这个可以创建文件所在的目录, 比如file_name是./a/file, 但是a这个文件夹不存在, 可以先使用这个来创建文件夹.

  1. os.makedirs(os.path.dirname(file_name), exist_ok=True# 没有就创建文件夹

listdir的使用

我们看一个修改文件名的例子,这里要求是把例如 1.jpg=>(1+num).jpg:

  1. import os
  2. import fire
  3. def addNum(num,path):
  4.     for file in reversed(os.listdir(path)):
  5.         # os.listdir('.')遍历文件夹内的每个文件名,并返回一个包含文件名的list
  6.         # 这里要倒序,防止小的把大的文件覆盖了
  7.         # file为文件名
  8.         filename,suffix = file.split('.')
  9.         if suffix == 'jpg':
  10.             # 改名文件名,比如原来为1.jpg=>(1+num).jpg
  11.             newfilename = "{:0>3d}".format(int(filename)+num)
  12.         newfilename = "{}.{}".format(newfilename,suffix)
  13.         print("Have changed {} to {}".format(file,newfilename))
  14.         os.rename("{}/{}".format(path,file), "{}/{}".format(path,newfilename))
  15. def main():
  16.     fire.Fire(addNum)
  17. if __name__=='__main__':
  18.     # python changeFileName.py 100 ./pic/filename
  19.     main()

os.walk的使用

有的时候, 我们需要处理的目录是多层的, 第一层目录下还有其他的目录, 这个时候就需要使用os.walk来进行相关的操作. 下面是一个简答的用法.

  1. import os
  2. for (root, dirs, files) in os.walk(rawPath):
  3.     for Ufile in files:
  4.         Path = os.path.join(root, Ufile) # 文件的所在路径
  5.         File = root.split('/')[-1] # 文件所在文件夹的名字

我们下面再给出一个更加详细的例子, 对文件夹内的图像进行遍历, 对每个文件夹内的图片进行大小的调整, 转换为灰度图, 并重新保存.

文件夹的结构大致如下图所示:

Python入门教程[7]-常用模块

我们也是使用os.walk来完成文件夹的遍历.

  1. # 将图片重新存储
  2. # - 调整大小
  3. # - 调整为灰色
  4. def image_preprocess(dir_path='./dogs_cats_gray/cat/'):
  5.     """图片预处理
  6.     """
  7.     i = 0
  8.     for img in tqdm(os.listdir(dir_path)): # 调用 tqdm 可视化循环处理过程
  9.         img_path = os.path.join(dir_path, img) # 图像的完整路径
  10.         img_data = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 使用 opencv读取图像
  11.         img_data = cv2.resize(img_data, (64, 64)) # 图片处理成统一大小
  12.         os.remove(img_path) # 删除原始图像
  13.         cv2.imwrite(img_path, img_data)# 保存新的图像
  14.         i = i + 1
  15.         if i%5000 == 0:
  16.             print('i:',i,'img_name:',img,image_label(img))

 

创建文件夹

在进行文件的复制的时候, 需要保证文件夹的存在, 我们可以使用以下的方式来进行判断和新建文件夹.

  1. os.makedirs(os.path.dirname(dest_fpath), exist_ok=True)
  2. shutil.copycopy(src_fpath, dest_fpath)

参考资料: create destination path for shutil.copy files

执行shell命令

使用os模块,还可以实现简单执行shell命令。

  1. os.system()

同时, 我们可以使用sys来执行cmd命令, 比如执行相应目录下的文件, 如下所示.

  1. import os
  2. print os.system('command')

下面是一个运行的示意图.

Python入门教程[7]-常用模块

统计文件大小

可以使用os.path.getsize(file)来获得文件的大小, 单位是bytes.

  1. def visitDir(path):
  2.     global totalSize
  3.     global fileNum
  4.     global dirNum
  5.     for lists in os.listdir(path):
  6.         sub_path = os.path.join(path, lists)
  7.         print(sub_path)
  8.         if os.path.isfile(sub_path):
  9.             fileNum = fileNum+1                      # 统计文件数量
  10.             totalSize = totalSize+os.path.getsize(sub_path)  # 文件总大小
  11.         elif os.path.isdir(sub_path):
  12.             dirNum = dirNum+1                       # 统计文件夹数量
  13.             visitDir(sub_path)                           # 递归遍历子文件夹

上面是一段参考代码, 获取文件夹内文件的数量和文件的大小.

参考资料: Python获取指定目录下文件数量及总大小

 

shutil

我们可以使用shutil模块来进行文件的复制, 粘贴, 等操作. 下面是一个简单的说明.

  1. shutil.copyfile( src, dst)    从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉
  2. shutil.move( src, dst)        移动文件或重命名
  3. shutil.copymode( src, dst)    只是会复制其权限其他的东西是不会被复制的
  4. shutil.copystat( src, dst)    复制权限、最后访问时间、最后修改时间
  5. shutil.copy( src, dst)        复制一个文件到一个文件或一个目录
  6. shutil.copy2( src, dst)        在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西
  7. shutil.copy2( src, dst)        如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作
  8. shutil.copytree( olddir, newdir, True/Flase)
  9. 把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接
  10. shutil.rmtree( src )    递归删除一个目录以及目录内的所有内容

参考资料: python文件创建,删除,移动,复制,重命名

 

sys

sys模块可以用于获取python解释器当前的一些状态变量,可以获取当前python的模块路径。

  1. import sys
  2. sys.path #查看当前python的环境变量

 

我们创建1.py文件写入如下代码

  1. import sys
  2. for i in sys.argv:
  3.     print(i)

 

接着运行 python3 1.py 1 2 3

可以看到输出为:

  1. 1.py
  2. 1
  3. 2
  4. 3

 

更多入门教程链接

关于更多入门教程, 可以通过下面的链接查看.

到这里这个系列就全部结束了,欢迎大家继续关注后面的内容。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: