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

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

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

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

自定义模块

有的时候, 我们在自己编写Python脚本的时候, 会把相关的脚本放在一个文件夹下, 然后组成一个module, 来方便我们使用. 例如, 这个时候文件夹的整体结构如下所示:

│  calSaturation.py

└─outputAnalyze

│  outputAnalysis.py

│  __init__.py

这里outputAnalyze相当于是我们自定义的一个模块. 在该文件夹下需要有一个init.py文件. 这个文件可以没有内容, 也可以将outputAnalysis.py文件中的类引入.

在init.py文件的内容如下所示, 需要注意的是, 我们需要在文件前加一个点(.), 表示是在当前文件夹内.

from .outputAnalysis import detector_parse

之后, 我们在外面, calSaturation.py引入的时候, 只需要使用下面的方式即可.

from outputAnalyze import *

添加搜索目录

有的时候,当我们自定义了多个 module 之后,我们需要添加搜索目录,来方便我们导入各个

module。按下面方式在主文件的最前面加上即可。

import os

import sys

filePath = os.path.dirname(os.path.abspath(__file__)) # 获取当前的路径

rootPath = os.path.abspath(os.path.join(filePath, "..")) # 获取上级路径

sys.path.append(filePath)

sys.path.append(rootPath)

pickle

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

写入方法

f = open('permissionList.pkl', 'wb')

pickle.dump(permissionList, f)

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

f = open('./ProcessData/NSL-KDD_MEAN.pkl', 'wb')

pickle.dump(nsl_kdd_data.dataMean, f)

f.close()

读取方法

with open('permissionList.pkl', 'rb') as f:

permissionList = pickle.load(f)

datetime

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

date 封装了日期操作

datetime 封装日期+时间操作, 这个一定要注意, 有的时候是datetime.datetime, 注意不要少写了.

timedelta 表示一个时间间隔,也就是日期时间的差值

下面看一下使用的例子:

from datetime import date,datetime,timedelta

t = datetime.now() #获取现在的时间

>> datetime.datetime(2018, 1, 25, 20, 3, 13, 311169)

datetime.strftime(t,'%Y-%m-%d %H:%M:%S') #把时间转换为字符串

>> '2018-01-25 20:03:13'

datetime.strptime('2018-01-25 20:03:13', '%Y-%m-%d %H:%M:%S') #把字符串转换为时间

>> datetime.datetime(2018, 1, 25, 20, 3, 13)

tnow = t + timedelta(weeks=1,days=0,hours=0,minutes=0)#对时间进行加减运算

datetime.strftime(tnow,'%Y-%m-%d %H:%M:%S')

>> '2018-02-01 20:03:13'

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

t = datetime.now() #获取现在的时间

datetime.strftime(t,'%Y-%m-%d_%H_%M_%S_%f')

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

datetime.datetime.fromtimestamp(1)

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

0a616f9cec9adf9de414ea5ac62c8d13.png

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

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

上面的结果如下所示:

fae15ce9608362fd6c01729d518f03fe.png

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

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

time.strftime('%H:%M:%S,%f')

最终的结果如下图所示,

86a8566df8d842f17bbf1be23a1573c5.png

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

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

最终结果如下图所示:

98bb6a554dea781c33fe9822ef6306b9.png

与pandas组合使用

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

df = pd.read_excel('上班时间.xlsx', encoding='utf-8')

a = pd.to_datetime(df['上班时间'], format="%H:%M:%S")

b = pd.to_datetime(df['下班时间'], format="%H:%M:%S")

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

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

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

os

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

创建文件夹

import os

os.getcwd() #获取当前目录

>> '/home/wmn'

os.mkdir('test') #创建文件夹

os.mknod(os.path.join(os.getcwd(),'text.txt'))#在当前目录创建一个text.txt文件

创建文件所在文件夹

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

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

获取当前文件地址和上级地址

下面第一行是获取所在文件的绝对路径地址. 第二个是获得其父级目录的地址.

filePath = os.path.dirname(os.path.abspath(__file__)) # 获取当前的路径

rootPath = os.path.abspath(os.path.join(filePath, "..")) # 获取上级路径

我们可以使用os.path.join来合成我们需要的文件的路径. 例如:

os.path.join(filePath, 'images/')

文件路径格式化

在 windows 下直接使用 os.path 会出现反斜杠的问题,如下所示:

eaa4f5b43ae3ca7914dd2f86125ba34b.png

这个时候我们可以使用 os.path.normpath 来进行格式的转化.

e37cd42e046bb16cda0285f016443625.png

分割文件夹路径

有的时候我们需要将我们的文件路径划分为文件夹的名称。如我们的路径为如下所示:

folder_path = 'D:\Traffic-Classification\data\preprocess_data'

那么我们可以使用 os.path.normpath(folder_path) 来转换路径的形式,接着使用 string.split 来进行分割。可以看一下下面的具体的例子:

ece453136578ab5bd654cefcb2d8a74e.png

listdir的使用

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

import os

import fire

def addNum(num,path):

for file in reversed(os.listdir(path)):

# os.listdir('.')遍历文件夹内的每个文件名,并返回一个包含文件名的list

# 这里要倒序,防止小的把大的文件覆盖了

# file为文件名

filename,suffix = file.split('.')

if suffix == 'jpg':

# 改名文件名,比如原来为1.jpg=>(1+num).jpg

newfilename = "{:0>3d}".format(int(filename)+num)

newfilename = "{}.{}".format(newfilename,suffix)

print("Have changed {} to {}".format(file,newfilename))

os.rename("{}/{}".format(path,file), "{}/{}".format(path,newfilename))

def main():

fire.Fire(addNum)

if __name__=='__main__':

# python changeFileName.py 100 ./pic/filename

main()

os.walk的使用

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

import os

for (root, dirs, files) in os.walk(rawPath):

for Ufile in files:

Path = os.path.join(root, Ufile) # 文件的所在路径

File = root.split('/')[-1] # 文件所在文件夹的名字

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

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

47a639b4ae6a9ff770d4c8c9e661a240.png

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

# 将图片重新存储

# - 调整大小

# - 调整为灰色

def image_preprocess(dir_path='./dogs_cats_gray/cat/'):

"""图片预处理

"""

i = 0

for img in tqdm(os.listdir(dir_path)): # 调用 tqdm 可视化循环处理过程

img_path = os.path.join(dir_path, img) # 图像的完整路径

img_data = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE) # 使用 opencv读取图像

img_data = cv2.resize(img_data, (64, 64)) # 图片处理成统一大小

os.remove(img_path) # 删除原始图像

cv2.imwrite(img_path, img_data)# 保存新的图像

i = i + 1

if i%5000 == 0:

print('i:',i,'img_name:',img,image_label(img))

创建文件夹

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

os.makedirs(os.path.dirname(dest_fpath), exist_ok=True)

shutil.copycopy(src_fpath, dest_fpath)

执行shell命令

使用os模块,还可以实现简单执行shell命令。这里除了使用下面的方式执行 shell 命令之外,我们还可以使用 subprocess 来执行命令,具体操作可以查看 Python 子进程管理–subprocess。这里建议使用 subprocess 来执行程序,不要直接使用 os.system。

os.system()

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

import os

print os.system('command')

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

132250a5624a2a72a3d52f410fee3200.png

统计文件大小

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

def visitDir(path):

global totalSize

global fileNum

global dirNum

for lists in os.listdir(path):

sub_path = os.path.join(path, lists)

print(sub_path)

if os.path.isfile(sub_path):

fileNum = fileNum+1                      # 统计文件数量

totalSize = totalSize+os.path.getsize(sub_path)  # 文件总大小

elif os.path.isdir(sub_path):

dirNum = dirNum+1                       # 统计文件夹数量

visitDir(sub_path)                           # 递归遍历子文件夹

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

shutil

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

shutil.copyfile( src, dst)    从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉

shutil.move( src, dst)        移动文件或重命名

shutil.copymode( src, dst)    只是会复制其权限其他的东西是不会被复制的

shutil.copystat( src, dst)    复制权限、最后访问时间、最后修改时间

shutil.copy( src, dst)        复制一个文件到一个文件或一个目录

shutil.copy2( src, dst)        在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西

shutil.copy2( src, dst)        如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作

shutil.copytree( olddir, newdir, True/Flase)

把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接

shutil.rmtree( src )    递归删除一个目录以及目录内的所有内容

这里再强调一下,如果只是文件的复制,使用 shutil.copy 即可;如果是文件夹的复制,那么需要使用 shutil.copytree。

sys

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

import sys

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

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

import sys

for i in sys.argv:

print(i)

接着运行 python3 1.py 1 2 3

可以看到输出为:

1.py

1

2

3

更多入门教程链接

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值