文件操作
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: I'm the main program Process 9089 says: I'm function 0 Process 9090 says: I'm function 1 Process 9091 says: I'm function 2 Process 9092 says: I'm 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 >>>
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 'föstudagur, október 31' 57 >>> 58 59 #lang_country的值可以这样获取 60 >>> import locale 61 >>> names = locale.locale_alias.keys()