os模块是与操作系统交互的模块
之前我们也用过os模块就是更改文件的名字的时候

我们如果用os求求文件夹是不行的  可以求文件  因为文件夹在python中最大就是4090个字节 所以你必须求出文件夹内的文件的大小相加

os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.popen("bash command).read() 运行shell命令,获取执行结果
os.environ 获取系统环境变量 os.path
os.path.abspath(path) 返回path规范化的绝对路径 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.isabs(path) 如果path是绝对路径,返回True
os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 一般用来判断是不是文件或者文件夹, 如果是文件就是true
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的大小 这个就是返回你传递进去的文件的 大小
os.path.basename(path) #获取path的文件名
 
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: ('.')
os.pardir 获取当前目录的父目录字符串名:('..')
os.makedirs('dirname1/dirname2') 可生成多层递归目录
os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname
os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename("oldname","newname") 重命名文件/目录
os.stat('path/filename') 获取文件/目录信息
os.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.popen("bash command).read() 运行shell命令,获取执行结果
os.environ 获取系统环境变量 os.path
os.path.abspath(path) 返回path规范化的绝对路径 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.isabs(path) 如果path是绝对路径,返回True
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的大小
import os
# os模块是与操作系统交互的模块、
# 之前我们就用过os模块 就是os.remove删除文件 os.rename ()给文件更改名字
# os.getcwd() # 获取当前工作目录仅仅是python脚本工作的目录路径 类是linux获取路径 linux直接就是cwd
# os.chdir('dirname') # 改变脚本的工作目录 相当于shell下cd ch就是change dir
# os.curdir() #返回当前目录 .最没用
# os.curdir() # 返回父级是.. 也没用
# os.makedirs('dirname1/dirname2') #可以生成多层递归目录 就是建立一个多层文件夹
# os.removedirs('dirname1/dirname2') #若目录为空就删除 返回上一级 要是上一级也为空就再删除就依次类推一直删除
# os.mkdir('dirname') # 建立一个空的文件夹
# os.rmdir('dirname') # 删除文件夹 此文件夹必须为空
# os.listdir('dirname') #找出你这个目录下的 所有的子目录包括隐藏的 相当于linux的tree
# os.remove() #删除一个文件
# os.rename('oldname','newname')#重命名
# os.stat('path/filename') # 获取文件/目录信息
# os.sep # 输出操作系统特定的路径分隔符
# print(os.getcwd())

# 计算文件夹中所所有文件的大

递归方法

import os
def get_size(dir):
sum_size = 0
for item in os.listdir(dir):
path = os.path.join(dir,item)
if os.path.isfile(path):
sum_size += os.path.getsize(path)
else:
sum_size += get_size(path)
return sum_size
ret = get_size('D:\python11')
print(ret)

用栈的思想来做:栈就是先进后出

def get_size(path):
l = [path]
sum_size = 0
while l: # 判读你传递进来的信息为空步为空
path = l.pop() # 删除你传递进来的最后一个元素
for item in os.listdir(path):# 遍历你传递进来的文件
path2 = os.path.join(path, item) # 如果是文件就把文件和 item你遍历的信息相加
if os.path.isfile(path2):#如果你所传递进来的是文件
sum_size += os.path.getsize(path2)
else:
l.append(path2) #如果不是文件 是文件夹就加进去 继续遍历循环
return sum_size
print(get_size('F:\zz'))

模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

模块就是把一定的功能封装在一个py文件中然后可以被调用

模块存在的意义:为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

导入模块使用import  导入一个模块的时候就是把这个模块从上到下的全部执行了一遍了,执行完之后再调用过来的

首次导入模块my_module时会做三件事:

  

1.为源文件(my_module模块)创建新的名称空间,在my_module中定义的函数和方法若是使用到了global时访问的就是这个名称空间。

2.在新创建的命名空间中执行模块中包含的代码,见初始导入import my_module

3.创建名字my_module来引用该命名空间

就是你先在自己的文件中开辟一个空间 这个空间用来存放你导入的模块 然后你导入模块的时候会在你本身内新创建空间中把你导入模块中的代码流程执行一遍 ,然后再去根据你的取值来调用模块中的你需要的内容

导入模块中执行的内容:

import my_moudule   #导入moudules模块
a = 10
print(my_moudule.a) #执行导入模块中的变量a
my_moudule.trashy() #执行你模块中函数
print(a) #执行你本身的变量

as的使用

as 就是可以把你的导入的模块更改一个名字 一般这样可以把你难以记忆的模块的名字给更改成你容易记忆的

import my_moudule as poor  #把你的导入的模块的使用名字更改为poor
print(poor.a) #可以直接用更改后的名字来使用导入的模块中的内容
poor.trashy()
下面就是as的典型使用场景  可以根据你的输入来判读你导入的模块
#这就是as的典型使用场景  可以根据你的输入来判读你导入的模块
inp = input('json or pickle>>>').strip()
if inp == 'json':
import json as m
elif inp == 'pickle':
import pickle as m m.pickle({'k':'v'})
m.loads()
一次性导入多个模块:
import 模块1,模块2,模块3
也可以一次导入多个模块 但是这用一般不推荐因为这样以后你不想注销一个模块的时候不好操作

我们还可以选择导入模块中的某一个功能:

from  导入的模块   import   模块中的功能

这样导入的只能具有这个import后面中的功能不能具有导入模块中的所有功能

eg:

from my_moudule import a
print(a)
print(my_moudule.a) #这样会报错因为你只是把模块中的a导入了进来而不是把整个模块导入进来

所以 导入的时候需要看你  import后面的内容

还有直接把模块中的内容给全部拿过来的

from  要导入的模块   import  *

这个是把所有的信息给全部都如了本地中  可以直接使用

但是一般不推荐 因为怕有一些错误的信息也带进了本文件中

from  my_moudule  import *
print(a)
print(trashy())

对于全部导入的* 有一个__all__方法最它的限制   我们可以让在2你导入的时候的__all__方法中 设置你要被导入的信息就可以限制*的内容

from  my_moudule import *
trashy() #这个可以
trashy2() # 这个报错 因为你导入的模块中的__all__==['a', 'trashy'] 了不包括trashy2
from ... import ...
from 模块名 import 名字
导入的名字直接属于全局,但是指向模块的名字所在的内存空间
导入的名字如果是函数或者方法,引用了全局的变量,
仍然使用模块中的变量
导入的名字和全局的名字是一样的,谁最后抢占到就是谁的
可以导入多个名字,用逗号分割
还可以起别名 as
from 模块 import * 那么默认会把模块中所有名字都导入到全局
* 和 __all__

 所以总结模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块

python解释器在启动时会自动加载一些模块,可以使用sys.modules查看

注意:模块在一个程序中只会被导入一次,不会重复导入(为了节约资源)那么,如何实现模块在程序中只会被导入一次呢?

当导入一个文件之后,会将模块存储在内存中,当再次导入的时候,就会到内存中查看是否导入过这个模块,如果已经导入过了,就不用再导入了。是通过sys里面的module方法

import sys
for i in sys.modules: #查看是否导入过这个模块
print(i)

模块和脚本的区别:

如果一个py文件被导入了那么他就是一个模块

如果这个py文件被执行了 这个直接被执行的文件就是一个脚本

把模块当作脚本执行的时候用到了一个很重要的知识点:

当做脚本运行:
__name__ 等于'__main__'

当做模块导入:
__name__= 模块名

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__':

def fib(n):
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print() if __name__ == "__main__":
print(__name__)
num = input('num :')
fib(int(num))

就是一个模块在自己的界面中执行__name__ 就等于执行了__main__这个方法

而被导入其他模块中执行的时候__name__就等于被导入的模块名字

包:

包其实就是一个模块只不过这个模块内包含了一个__init__的py文件

只不过导入包的时候是先执行包中的__init__方法的,第一步就是执行这个__init__方法的

导入包的过程也和导入模块不一样  包一般要配合点 . 出现的

只不过你导入包的时候需要看看路径下有没有这个包 用sys.path()查看选下是否有这个包 有了就可以导入

1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法

2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)

3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

强调:

  1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错

  2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包即模块

包的调用一般都是和点配合使用的

模块是对外提供功能的

如果 我写的这个模块 足够大 能提供的功能足够多
多到一个文件写不下
把对外提供的功能 根据提供的内容不同,分成几个文件
把这些文件放在一个文件夹下,就形成了包
凡是在导入时带点的,点的左边都必须是一个包 凡是在导入时 带点的,点的左边都必须是一个包:
第一种导入方式:
from glance.api import policy   #把glance包中api中的policy导过来
#第二种方式
import glance.api.policy  # 把glance包中的api中的policy导入进来
#第三种方式
import glance.api.policy as pp # 和模块一样用as 把你导入的包中的信息改为pp来使用

# 使用绝对路径
# 导入一个包 相当于 执行了这个包下面的 __init__.py

# 绝对路径
# 被直接执行的文件与包的关系必须是固定的,
# 一旦发生改变,包内的所有关系都要重新指定
# 跨包引用

# 在一个py文件中使用了相对路径引入一个模块
# 那么这个文件就不能被当成脚本运行了

就是你在一个文件中使用了向堆路径调用了一个模块 那么你不能直接运行这个模块

需要再找一个文件把这个文件导入进去运行

# 包就是py模块的集合
# 自带__init__.py文件
# py2 包中必须有一个__init__.py文件
# py3
# 能不能导入一个包:要看sys.path中的路径下有没有这个包
# 从包中导入模块: 把包与包之间的关系写清楚,精确到模块,就一定能导入
# 直接导入一个包,并不会导入包下的模块,而是执行这个包下的__init__.py文件
# 如果对导入还有更高的要求
# 可以对包中的__init__.py文件做定义
# 绝对路径导入的方式
# 相对路径导入的方式 使用相对路径导入的模块不能作为脚本执行

os 模块 模块与包的初始的更多相关文章

  1. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  2. 第十八篇 模块与包--time&random模块&模块导入import(os.path.dirname(os.path.abspath(__file__)))

    模块 在Python中, 一个.py文件就称为一个模块. 使用模块的好处: 1. 最大的好处就是大大提高了代码的可维护性 2. 编写代码不必从零开始.一个模块编写完毕,就可以被其他地方引用.在写其他程 ...

  3. (转)python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    阅读目录 1.1.1导入模块 1.1.2__name__ 1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代 ...

  4. os常用模块,json,pickle,shelve模块,正则表达式(实现运算符分离),logging模块,配置模块,路径叠加,哈希算法

    一.os常用模块 显示当前工作目录 print(os.getcwd()) 返回上一层目录 os.chdir("..") 创建文件包 os.makedirs('python2/bin ...

  5. (转载)Python 的 JPype 模块调用 Jar 包

    Python 的 JPype 模块调用 Jar 包 背景与需求 最近学习并安装使用了HttpRunner框架去尝试做接口测试,并有后续在公司推广的打算. HttpRunner由Python开发,调用接 ...

  6. Python(模块(modue)、包(package))

    ''' 一 模块 模块一共三种: python标准库 第三方模块 应用程序自定义模块 模块两种执行方式: 1 用于启动执行 2 用于被调用执行 key:import module: 将执行文件(mod ...

  7. subprocess, re模块,logging, 包等使用方法

    subprocess, re模块,logging, 包等使用方法 subprocess ''' subprocess: sub: 子 process: 进程 可以通过python代码给操作系统终端发送 ...

  8. 21.python的模块(Module)和包(Package)

    目录 模块(Module)和包(Package) 模块(modue)的概念 模块导入方法 1.import 语句 2.from-import 语句 3.from-import* 语句 4.运行本质 i ...

  9. os模块和os.path模块常用方法

    今天和大家分享python内置模块中的os模块和os.path模块. 1.什么是模块呢? 在计算机开发过程中,代码越写越多,也就越来越难以维护,所以为了可维护的代码,我们会把函数进行分组,放在不同的文 ...

随机推荐

  1. SASS的安装和转换为CSS的方法

    http://www.cnblogs.com/52css/archive/2012/08/19/sass-how-to-install-and-use.html SASS的安装方法: 1.先安装Rub ...

  2. mongodb启动失败:child process failed, exited with error number 100

    参考 http://www.dataguru.cn/thread-107361-1-1.html 里面的路径 根据自己的--dbpath的路径  和l--logpath路径去找

  3. Java源码安全审查

    最近业务需要出一份Java Web应用源码安全审查报告, 对比了市面上数种工具及其分析结果, 基于结果总结了一份规则库. 本文目录结构如下: 检测工具 FindSecurityBugs 基于class ...

  4. SQL语句——入门级

    入门级别的sql语句,“--”两条横线表示sql语句的注释 表: id name age height2015102   老王 68 170.320150101  张三 null null201501 ...

  5. Weblogic Maven

    从weblogic 10.3.4开始支持maven deploy部署   步骤如下: 1.构建weblogic-maven-plugin jar 在D:\oracle\Middleware\wlser ...

  6. R语言中apply函数

    前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言 ...

  7. Linux 的启动流程--转

    http://cloudbbs.org/forum.php?mod=viewthread&tid=17814 半年前,我写了<计算机是如何启动的?>,探讨BIOS和主引导记录的作用 ...

  8. 498_Diagonal-Traverse

    目录 498_Diagonal-Traverse Description Solution Java solution Python solution 1 Python solution 2 Pyth ...

  9. DataGridView 隔行显示不同的颜色

    两种方法 第一种 DataGridview1.Rows[i].DefultCellStyle.backcolor 第二种 AlternatingRowsDefutCellstyle 属性 获取或设置应 ...

  10. Github - 修改语言统计

    前些日子看到有人提到这个问题,于是自己也试着解决了一番,在此记录下来,希望对大家有帮助. Github中创建一个repository后会出现一个统计使用语言的颜色条. 就是下面这个东西: 似乎很多人遇 ...