Python在操作系统层面上的操作
来源:互联网 发布:手机动漫壁纸软件 编辑:程序博客网 时间:2024/05/21 11:28
文件
用open()创建文件
用exist()检查文件或者目录是否存在
用isfile()检查是否为文件;用isdir()检查是否为路径;用isabs()检查是否为绝对路径
用copy()复制文件(import shutil)
用rename()重命名文件
用link()或者symlink()创建链接
1.符号链接和硬链接的区别:
硬链接中,找到一个文件的所有名称并不容易。可以考虑使用符号链接,它会把新名称当作文件存储。
2.
在Unix中,文件只存在于一个位置,但是可以有多个名称,这种机制叫做链接。link()会创建一个硬链接。symlink()会创建一个符号链接。islink()函数会检查参数是文件还是符号链接。
用chmod()修改权限
在Unix系统中,chomd()可以修改文件权限。可以设置用户(如果是你创建文件,那用户通常就是你),当前用户所在用户组以及其他用户组的读、写和执行权限。
这个命令接收一个压缩过的八进制值,这个值包含用户、用户组和权限。
# 让oops.txt只能被拥有者读os.chmod('oops.txt', 0o400)
# 如果你不想用压缩过的八进制值,可以从stat模块中导入一些常量import statos.chmod('oops.txt', stat.S_IRUSR)
用chown()修改所有者
这个函数也是Unix/Linux/Mac特有的。**你可以指定用户的ID(uid)和用户组(gid)来导入一些常量并用在语句中:
uid = 5gid = 22os.chown('oops', uid, gid)
用abspath()获取路径名(把一个相对路径名扩展成绝对路径名)
用realpath()获取符号的路径名(注意:Linux下os.path.realpath(‘jeeper.txt’的结果本应该是oops.txt的路径,而我的实验室在win7下,所以结果还是jeeper.txt的路径))
用remove()删除文件
目录
在大多数操作系统中,文件被存储在多级目录(现在经常被称为文件夹)。包含所有这些文件和目录的容器是文件系统(有时候被称为卷)。
使用mkdir()创建目录
使用rmdir()删除目录
使用listdir()列出目录内内容
使用chdir()修改当前目录
使用glob()列出匹配文件
glob()函数会使用Unix shell的规则来匹配文件或者目录,而不是更复杂的正则表达式。具体规则如下所示:
- *会匹配任意名称(正则表达式(re)是.*)
- ?会匹配一个字符
- [abc]会匹配字符a、b或c
- [!abc]会匹配除了a、b和c之外的所有字符
程序和进程
当运行一个程序时,操作系统会创建一个进程。它会使用系统资源(CPU、内存和磁盘空间)和操作系统内核中的数据结构(文件、网络连接、用量统计等)。进程之间是相互隔离的,即一个进程既无法访问其他进程的内容,也无法操作其他进程。
操作系统会跟踪所有正在运行的进程,给每个进程一小段运行时间,然后切换到其他进程,这样既可以做到公平又可以响应用户操作。
注意:后面两个函数出错,主要是因为操作系统是windows而不是linux
使用subprocess创建进程
到目前为止,你看到的所有程序都是单进程程序。你可以使用Python标准库中的subprocess模块来启动和终止其他程序。
getoutput()
如果只是想在shell中运行其他程序并获取它的输出,可以使用getoutput()函数。
# 这里获取了Unix date程序的输出import subprocessret = subprocess.getoutput('date')
注意:在程序执行完毕之前,你获取不到任何内容。如果需要调用一些比较耗时的程序,可以使用并发。
因为getoutput()的参数是一个字符串,可以表示一个完整的shell命令,所以你可以在里面使用参数、管道、I/O重定向<和>,等等:
ret = subprocess.getoutput('date -u')ret = subprocess.getoutput('date -u | wc')
check_output()
check_output()可以接受一个命令和参数列表。默认情况下,它返回的不是字符串,而是字节类型的标准输出。此外,这个函数并没有使用shell:
ret = subprocess.check_output(['date', '-u'])
getstatusoutput()
getstatusoutput()返回一个包含状态码和输出的元组:
ret = subprocess.getstatusoutput('date')
call()
call()只返回退出状态(在Unix类操作系统中,退出状态0通常表示运行成功)
ret = subprocess.call('date')
你可以用两种方式来运行带参数的程序。
在字符串中写明参数
# 需要加上参数shell=True,这个样子函数就会用shell来执行命令ret = subprocess.call('date -u', shell=True)
出入一个参数列表
# 不需要调用shellret = subprocess.call(['date', '-u'])
使用multiprocessing创建进程
你可以在一个单独的进程中运行一个Python函数,也可以使用multiprocessing模块在一个程序中运行多个进程。
import multiprocessingimport osdef whoami(what): print("Process %s says: %s" % (os.getpid(), what))def do_this(what): whoami(what)if __name__ == "__main__": whoami("I'm the main program") for n in range(4): # Process()函数会创建一个新进程来运行do_this()函数 p = multiprocessing.Process(target=do_this, args=("I'm function %s" % n,)) p.start()
结果:
Process 28356 says: I'm the main programProcess 28644 says: I'm function 0Process 28572 says: I'm function 3Process 28628 says: I'm function 1Process 28612 says: I'm function 2
multiprocessing模块真正的功能比这个例子中展示的要强大得多。当你需要用多线程来减少运行时,它非常有用,比如下载需要抓取的页面,调整图片尺寸等。它支持任务队列和进程间通信,而且可以等待所有进程执行完毕。
使用terminate()终止进程
如果创建了一个或者多个进程并且想终止它们。下面的例子中,我们的进程会一直计数到百万,每次计数之后都会等待1秒并打印出相关信息。然而,主程序只会保持5秒耐心,之后就会终止程序:
import multiprocessingimport timeimport osdef whoami(name): print("I'm %s, in process %s" % (name, os.getpid()))def loopy(name): whoami(name) start = 1 stop = 10000000 for num in range(start, stop): print("\tNumber %s of %s. Honk!" % (num, stop)) time.sleep(1)if __name__ == "__main__": whoami("I'm the main program") p = multiprocessing.Process(target=loopy, args=("loopy",)) p.start() time.sleep(5) p.terminate()
结果:
I'm I'm the main program, in process 29692I'm loopy, in process 25944 Number 1 of 10000000. Honk! Number 2 of 10000000. Honk! Number 3 of 10000000. Honk! Number 4 of 10000000. Honk! Number 5 of 10000000. Honk!Process finished with exit code 0
日期和时间
datetime模块
datetime模块定义了4个主要的对象,每个对象都有很多方法:
- date 处理年、月、日(date的范围是date.min(1-1-1)到date.max(9999-12-31),不能使用它来进行和历史或者天文相关的计算)
- time 处理时、分、秒和微秒
- datetime 处理日期和时间同时出现的情况
- timedelta 处理日期和/或时间间隔
使用time模块
Python的datetime模块中有一个time对象,Python还有一个单独的time模块。
一种表示绝对时间的方法是计算从某个起始点开始的秒数。Unix时间使用的是从1970年11月1日0点开始的秒数。这个值通常被称为纪元。它是不同系统之间最简单的交换日期时间的方法。
time模块的time()函数会返回当前时间的纪元值:
尽量多实用UTC来代替时区。UTC是绝对时间,和时区无关。如果你有服务器,把它的时间设置为UTC,不要使用本地时间。
读写日期和时间
isoformat()并不是唯一一种可以打印日期和时间的方法,如time模块中的ctime()函数。
strftime()
strftime()把日期和时间转换成字符串,这个方法在datetime、date和time对象中都有,在time模块中也有。
strftime()的格式化字符串
数字都是左侧补零
strptime()
如果要把字符串转换成日期或者时间,可以对同样的格式化字符串使用strptime()函数。
setlocale()打印出不同的月和日名称
unsupported locale setting
or
下面是结合了语言和国家名称的缩写字符串
其他模块
第三方模块:
- arrow(这个模块有许多日期和时间函数,并提供了简单易用的API)
- dateutil(这个模块可以解析绝大多数日期格式,并且可以很好地处理相对日期和时间)
- iso8601(这个模块会完善标准库中对于ISO8601格式的处理)
- fleming(这个模块提供了许多时区函数)
- Python在操作系统层面上的操作
- 三、数据库层面上的操作
- HTML5:插入视频及在视频层面上执行的操作
- 使用GPS如何在软件和操作层面上实现快速高精度的定位?
- static函数的作用是在链接层面上
- WebRTC和SIP在信令层面上的区别?
- 多线程操作数据库时为了防止数据的增删改的混乱该在数据库层还是程序层面上进行同步?
- 技术人,不要总在很初级的层面上谈管理
- 技术人,不要总在很初级的层面上谈管理
- 技术人,不要总在很初级的层面上谈管理
- 技术人,不要总在很初级的层面上谈管理
- Android高斯模糊在java层面上的两种实现方式
- 目前层面上对windows的理解
- 安全不只是意识层面上的
- 利用Java Annotation 和 Spring AOP实现在Controller层面的操作日志记录
- 在基于OMAP3530的DevKit8000开发板上实现Linux操作系统下的GPIO读写操作
- 在三种操作系统上安装python运行环境的方法
- 不同层面上操控I2C进行读写操作
- MySQL定期分析检查与优化表
- 数据库总结(二)
- Android多渠道打包
- JVM内存管理和GC机制
- 畅通工程再续||HDU1875
- Python在操作系统层面上的操作
- MFC和Qt分别使用Qt生成的Dll。
- HDU1405 The Last Practice
- linux中硬链接与软链接的区别与联系
- iOS开发中系统的UITableViewCell只有当有数据的时候显示分割线
- 外网ip注册dubbo服务
- Jedis
- HDU 1130 How Many Trees卡特兰数
- HTTP状态码查询手册