• 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: 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 >>> 
    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 'föstudagur, október 31'
    57 >>>
    58 
    59 #lang_country的值可以这样获取
    60 >>> import locale
    61 >>> names = locale.locale_alias.keys()
    example
  • 相关阅读:
    文件管理后章
    文件管理前章
    文本处理三剑客
    匿名函数以及应用、三元表达式
    认识docker以及常用操作
    字符编码
    赋值与深浅拷贝
    Python基本运算符
    LVM配置
    Linux磁盘管理
  • 原文地址:https://www.cnblogs.com/cedrelaliu/p/6033351.html
Copyright © 2020-2023  润新知