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个主要的对象,每个对象都有很多方法:

  1. date 处理年、月、日(date的范围是date.min(1-1-1)到date.max(9999-12-31),不能使用它来进行和历史或者天文相关的计算)
  2. time 处理时、分、秒和微秒
  3. datetime 处理日期和时间同时出现的情况
  4. 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()的格式化字符串

格式化字符串 日期/时间单元 范围 %Y 年 1900-… %m 月 01-12 %B 月名 January,… %b 月名缩写 Jan,… %d 日 01-31 %A 星期 Sunday,… %a 星期缩写 Sun,… %H 时(24小时制) 00-23 %I 时(12小时制) 01-12 %p 上午/下午 AM, PM %M 分 00-59 %S 秒 00-59

数字都是左侧补零

这里写图片描述

strptime()

如果要把字符串转换成日期或者时间,可以对同样的格式化字符串使用strptime()函数。

这里写图片描述

setlocale()打印出不同的月和日名称

unsupported locale setting
or

下面是结合了语言和国家名称的缩写字符串
这里写图片描述

其他模块

第三方模块:

  • arrow(这个模块有许多日期和时间函数,并提供了简单易用的API)
  • dateutil(这个模块可以解析绝大多数日期格式,并且可以很好地处理相对日期和时间)
  • iso8601(这个模块会完善标准库中对于ISO8601格式的处理)
  • fleming(这个模块提供了许多时区函数)
阅读全文
0 0