首页 > 代码库 > Python系统(os)相关操作

Python系统(os)相关操作

文件操作

python中常用于文件处理的模块有os,shutil等。

1 创建文件

文件的创建可以使用open()函数,如下创建一个test_file.txt的文件:

>>> with open(/Users/xxx/test_file.txt,wt) as f_obj:
...     print("This is the content from the test file---John",file=f_obj)
... 
>>> 

执行完后,可以找到该文件/Users/xxx/test_file.txt

2 判断文件是否存在

判断文件是否存在可以使用os模块的exists()函数,如下:

>>> import os
>>> os.path.exists(/Users/xxx/test_file.txt1)
False
>>> os.path.exists(/Users/xxx/test_file.txt)
True
>>> os.path.exists(‘/Users/xxx‘)
True
>>> os.path.exists(‘/Users/xxx‘)
False

exists()函数也可以判断目录是否存在。

3 检查是否为文件

可以使用os 模块中的isfile()来检查是否是文件,如下:

>>> os.path.isfile(/Users/xxx)
False
>>> os.path.isfile(/Users/xxx/test_file.txt)
True
>>> 

4 文件复制

使用shutil模块中的copy()/remove()函数可以用来复制文件,如下:

>>> import shutil
>>> shutil.copy(/Users/xxx/test_file.txt,/Users/xxx/test_file_copy.txt)
/Users/xxx/test_file_copy.txt
>>> 
>>> shutil.move(/Users/xxx/test_file_copy.txt,/Users/xxx/test_file_copy2.txt)
/Users/xxx/test_file_copy2.txt
>>> 

remove()相比copy(),会把原文件删除。

5 重命名文件

使用os模块中的rename()函数可以用来重命名一个文件,如下:

>>> import os
>>> os.rename(/Users/xxx/test_file_copy2.txt,/Users/xxx/test_file_will_be_delete.txt)
>>> 

6 删除文件

使用os模块中的remove()函数可以删除一个文件,如下:

>>> os.remove(/Users/liuchun/test_file_will_be_delete.txt)                   
>>> 

7 创建link

os模块中的link()函数可以用来创建文件的硬链接,symlink()函数可以用来创建软链接,如下:

>>> import os                                       
>>> os.link(/Users//test_file.txt,/Users/xxx/test_file_hardlink) 
>>> os.symlink(/Users/xxx/test_file.txt,/Users/xxx/test_file_softlink)
>>> 

xxxdembp:~ xxx$ ls -l test_file*
-rw-r--r--  2 xxx  staff  46 11 14 18:09 test_file.txt
-rw-r--r--  2 xxx  staff  46 11 14 18:09 test_file_hardlink
lrwxr-xr-x  1 xxx  staff  28 11 14 18:36 test_file_softlink -> /Users/xxx/test_file.txt

有关硬链接和软链接的知识请自行科普。

8 修改权限/所有者

os模块中的chmod()用来修改文件权限,这个命令接收一个压缩过的八进制(基数为 8)值,这个值包含用户、用户组和权限。而chown()用来修改文件的所有者,如下:

xxxdembp:~ xxx$ ls -l test_file.txt 
-rw-r--r--  2 xxx  staff  46 11 14 18:09 test_file.txt

>>> os.chmod(/Users/xxx/test_file.txt,0o777)

xxxdembp:~ xxx$ ls -l test_file.txt 
-rwxrwxrwx  2 xxx  staff  46 11 14 18:09 test_file.txt
xxxdembp:~ xxx$ 
>>> uid = 5
>>> gid = 22
>>> os.chown(/Users/xxx/test_file.txt, uid, gid)

9 获取路径

使用os模块中的abspath()可以获取文件的绝对路径,使用realpath()可以获取软链接对应的路径。

>>> os.path.abspath(/Users/xxx/test_file.txt)
/Users/xxx/test_file.txt
>>> os.path.realpath(/Users/xxx/test_file_hardlink)
/Users/xxx/test_file_hardlink
>>> os.path.realpath(/Users/xxx/test_file_softlink)
/Users/xxx/test_file.txt
>>> 

 

 

目录操作

os模块中的一些函数也可以对操作系统中的目录进行操作。

1 创建目录

使用os模块中的mkdir()可以创建目录,如下:

>>> import os
>>> os.mkdir(/Users/xxx/test_dir)
>>> os.path.exists(/Users/xxx/test_dir)
True
>>> 

 

2 列出目录内容

使用os模块的listdir()可以列出目录中的内容,如下:

test_dir目录为空
>>> os.listdir(/Users/liuchun/test_dir)
[]

在test_dir中创建一个子目录2nd_layer_dir和一个文件test_file1
>>> os.listdir(/Users/liuchun/test_dir)
[2nd_layer_dir, test_file1]
>>> 

 

3 切换工作目录

使用os模块中的chdir()可以切换当前的工作目录,如下:

>>> os.listdir(/Users/xxx/test_dir)
[2nd_layer_dir, test_file1]
>>> os.chdir(/Users/xxx/)
>>> os.listdir(.)
[.anyconnect, .bash_history, .bash_profile, .bash_sessions, .CFUserTextEncoding, .cisco,  test_dir, test_file.txt, test_file_hardlink, test_file_softlink, VirtualBox VMs]
>>> 

 


4 删除目录

使用os模块中的rmdir()函数可以删除目录,如下:

>>> os.rmdir(/Users/xxx/test_dir)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 66] Directory not empty: /Users/xxx/test_dir

# 目录不为空的时候删除会报如上错误,清空后可以删除如下
>>> os.rmdir(/Users/xxx/test_dir)
>>> 

 

5 查找匹配的文件目录

使用glob模块的glob()函数可以用来查找匹配文件或者目录,匹配的规则如下:

? *  匹配任意名称
? ?  匹配一个字符
? [abc]  匹配字符 a、b 和 c
? [!abc] 匹配除了 a、b 和 c 之外的所有字符

几个例子如下:

>>> import glob
>>> glob.glob(/Users/xxx/test*)
[/Users/xxx/test_dir, /Users/xxx/test_file.txt, /Users/xxx/test_file_hardlink, /Users/xxx/test_file_softlink]
>>> 
# 匹配以test开头的文件和目录

# 匹配以M或者D开头,s结尾的文件或目录
>>> glob.glob(/Users/xxx/[MD]*s)
[/Users/xxx/Documents, /Users/xxx/Downloads, /Users/xxx/Movies, /Users/xxx/MyDocuments]
>>> 

 

程序/进程操作

 

1 一些基础操作

os模块中的函数可以获取进程号,当前工作目录,用户id和组id,如下:

>>> import os
>>> os.getpid()  #获取python解释器的pid
5541
>>> os.getcwd()  #获取当前工作目录
/Users/xxx
>>> os.getuid()   #获取 user id
501
>>> os.getgid()   # 获取 group id
20
>>> 

 

2 启动/执行进程

2.1 使用subprocess

使用subprocess模块可以执行命令,这个会生成一个子进程去执行。

getoutput()函数

返回命令执行结果

>>> import subprocess
>>> ret = subprocess.getoutput(date)
>>> ret
2016年11月14日 星期一 22时14分39秒 CST
>>> 

getstatusoutput()函数

返回状态码和命令执行结果

>>> ret = subprocess.getstatusoutput(date)
>>> ret
(0, 2016年11月14日 星期一 22时18分04秒 CST)
>>> ret2 = subprocess.getstatusoutput(ll)
>>> ret2
(127, /bin/sh: ll: command not found)
>>> 

call()函数

获取命令执行状态

>>> ret3 = subprocess.call(ls -l,shell=True)
total 80
drwx------+  8 xxx  staff    272 11 14 14:34 Desktop
drwx------+  8 xxx  staff    272 11  3 15:21 Documents
drwx------+ 23 xxx  staff    782 11 14 18:04 Downloads
drwxr-xr-x   3 xxx  staff    102 11  3 16:07 IBMERS
drwx------@ 57 xxx  staff   1938 11 14 12:45 Library
drwx------+  3 xxx  staff    102 11  3 11:09 Movies
drwx------+  4 xxx  staff    136 11  4 18:36 Music

 

2.2 使用multiprocessing创建执行多个进程

import multiprocessing
import os

def do_this(what):
    whoami(what)

def whoami(what):
    print("Process %s says: %s" % (os.getpid(), what))
     
if __name__ == "__main__":
    whoami("I‘m the main program")
    for n in range(4):
        p = multiprocessing.Process(target=do_this,
        args=("I‘m function %s" % n,))
        p.start()

192:python$ python3 mp.py 
Process 9088 says: Im the main program
Process 9089 says: Im function 0
Process 9090 says: Im function 1
Process 9091 says: Im function 2
Process 9092 says: Im function 3

 

时间和日期操作

python中提供了多种模块用于时间和日期的操作,比如calendar,datetime,time等模块。

1 datetime模块

定义了4个主要的对象,每个对象有各自的方法:

? date 处理年、月、日
? time 处理时、分、秒和分数
? datetime 处理日期和时间同时出现的情况
? timedelta 处理日期和 / 或时间间隔

技术分享
 1 >>> from datetime import date
 2 >>> halloween = date(2014, 10, 31)
 3 >>> halloween
 4 datetime.date(2014, 10, 31)
 5 >>> halloween.day
 6 31
 7 >>> halloween.month
 8 10
 9 >>> halloween.year
10 2014
11 
12 >>> halloween.isoformat()
13 2014-10-31
14 >>> 
15 
16 >>> now=date.today()
17 >>> now
18 datetime.date(2016, 11, 14)
19 >>> 
20 
21 >>> from datetime import timedelta
22 >>> one_day = timedelta(days=1)
23 >>> tomorrow = now + one_day
24 >>> tomorrow
25 datetime.date(2016, 11, 15)
26 >>> now + 17*one_day
27 datetime.date(2016, 12, 1)
28 >>> yesterday = now - one_day
29 >>> yesterday
30 datetime.date(2016, 11, 13)
31 >>> 
32 
33 #datetime 模块中的 time 对象用来表示一天中的时间
34 >>> from datetime import time
35 >>> noon = time(12,0,0)
36 >>> noon
37 datetime.time(12, 0)
38 >>> noon.hour
39 12
40 >>> noon.minute
41 0
42 >>> noon.second
43 0
44 >>> noon.microsecond
45 0
46 >>> 
47 
48 >>> from datetime import datetime
49 >>> some_day = datetime(2016, 11, 12, 13, 24, 35,56)
50 >>> some_day.isoformat()
51 2016-11-12T13:24:35.000056
52 >>> 
53 
54 >>> now = datetime.now()
55 >>> now
56 datetime.datetime(2016, 11, 14, 23, 46, 4, 459142)
57 >>> 
example

 

2 time模块

技术分享
 1 #time 模块的 time() 函数会返回当前时间的纪元值,距离1970年1月1日0点开始的秒数
 2 >>> import time
 3 >>> now = time.time()
 4 >>> now
 5 1479138472.081136
 6 >>> 
 7 
 8 >>> time.ctime(now)
 9 Mon Nov 14 23:47:52 2016
10 >>> 
11 
12 #struct_time对象,ocaltime() 会 返回当前系统时区下的时间,gmtime() 会返回 UTC 时间
13 >>> time.localtime(now)
14 time.struct_time(tm_year=2016, tm_mon=11, tm_mday=14, tm_hour=23, tm_min=47, tm_sec=52, tm_wday=0, tm_yday=319, tm_isdst=0)
15 >>> time.gmtime(now)
16 time.struct_time(tm_year=2016, tm_mon=11, tm_mday=14, tm_hour=15, tm_min=47, tm_sec=52, tm_wday=0, tm_yday=319, tm_isdst=0)
17 >>> 
18 
19 # 转换为纪元值
20 >>> tm = time.localtime(now)
21 >>> time.mktime(tm)
22 1479138472.0
23 >>> 
24 
25 #strftime()把时间和日期转换成字符串
26 >>> import time
27 >>> fmt = "It‘s %A, %B %d, %Y, local time %I:%M:%S%p"
28 >>> t = time.localtime()
29 >>> t
30 time.struct_time(tm_year=2014, tm_mon=2, tm_mday=4, tm_hour=19,
31 tm_min=28, tm_sec=38, tm_wday=1, tm_yday=35, tm_isdst=0)
32 >>> time.strftime(fmt, t)
33 "It‘s Tuesday, February 04, 2014, local time 07:28:38PM"
34 
35 #strptime()把字符串转换成时间和日期
36 >>> time.strptime("2012-01-29", fmt)
37      time.struct_time(tm_year=2012, tm_mon=1, tm_mday=29, tm_hour=0, tm_min=0,
38      tm_sec=0, tm_wday=6, tm_yday=29, tm_isdst=-1)
39 
40 #针对不同的语言地区输出不同的日期
41 >>> import locale
42 >>> from datetime import date
43 >>> halloween = date(2014, 10, 31)
44 >>> for lang_country in [en_us, fr_fr, de_de, es_es, is_is,]:
45      ...     locale.setlocale(locale.LC_TIME, lang_country)
46 ... halloween.strftime(%A, %B %d) ...
47 en_us
48 Friday, October 31
49 fr_fr
50 Vendredi, octobre 31
51 de_de
52 Freitag, Oktober 31
53 es_es
54 viernes, octubre 31
55 is_is
56 fo?studagur, okto?ber 31
57 >>>
58 
59 #lang_country的值可以这样获取
60 >>> import locale
61 >>> names = locale.locale_alias.keys()
example

 

Python系统(os)相关操作