os 模块
    这个模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。

    os.sep  获取操作系统特定的路径分割符。比如在Linux、Unix下它是'/',在Windows下它是'\\',而在Mac OS下它是':'。
    os.name 字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。
    os.getcwd() 函数得到当前工作目录,即当前Python脚本工作的目录路径。
    os.getenv(key) 函数用来读取环境变量。
    os.putenv(key, value) 函数用来设置环境变量。
    os.listdir(path) 返回指定目录下的所有文件和目录名。
    os.remove(filePath) 函数用来删除一个文件。
    os.system(shellStr) 函数用来运行shell命令,windows平台则是运行批处理命令。
    os.linesep  字符串给出当前平台使用的行终止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
    os.path.split(pathname)  函数返回一个路径的目录名和文件名。
    os.path.isfile(path) 函数检验给出的路径是否一个文件。
    os.path.isdir(path)  函数分别检验给出的路径是否目录。
    os.path.existe(path) 函数用来检验给出的路径是否真地存在。

文件操作
  一、在pythony 3.0 已经废弃了 file 类。

  二、pythony 3.0 内置 open() 函数的构造函数是:
    open(file, mode="r", buffering=None, encoding=None, errors=None, newline=None, closefd=True)
    1.mode(模式):
      r: 读,只能读文件,如果文件不存在,会发生异常
      w: 写,只能写文件,如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件
      a: 打开供追加
      b: 二进制模式;一般是组合写法,如: rb 以二进制读方式打开;wb 以二进制写方式打开
      t: 文本模式
      +: 打开一个磁盘文件供更新,一般是组合使用,如:
         rb+: 以二进制读方式打开,可以读、写文件,如果文件不存在,会发生异常
         wb+: 以二进制写方式打开,可以读、写文件,如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件
      u: 通用换行模式
      默认的模式是 rt,即打开供读取的文本模式。
    2.buffering 关键字参数的期望值是以下三个整数中的一个以决定缓冲策略:
      0: 关闭缓冲
      1: 行缓冲
      > 1: 所填的 int 数=缓冲区大小
      默认: 完全缓冲
    3.encoding 默认的编码方式独立于平台。
    4.关闭文件描述符 closefd 可以是 True 或 False 。
      如果是 False,此文件描述符会在文件关闭后保留。若文件名无法奏效的话,那么必须设为 True 。

  三、清空文件内容
    f.truncate()
    注意:当以 "r+","rb+","w","wb","wb+"等模式时可以执行该功能,即具有可写模式时才可以。

  四、文件的指针定位与查询
    (1)文件指针:
         文件被打开后,其对象保存在 f 中, 它会记住文件的当前位置,以便于执行读、写操作,
         这个位置称为文件的指针( 一个从文件头部开始计算的字节数 long 类型 )。
    (2)文件打开时的位置:
         以"r","r+","rb+" 读方式, "w","w+","wb+"写方式 打开的文件,
         一开始,文件指针均指向文件的头部。
    (3)获取文件指针的值:
         L = f.tell()
    (4)移动文件的指针
         f.seek(偏移量, 选项) # 偏移量 是 long 或者 int 类型,计算偏移量时注意换行符是2,汉字可能是2或3
         选项 =0 时, 表示将文件指针指向从文件头部到 "偏移量"字节处。
         选项 =1 时, 表示将文件指针指向从文件的当前位置,向后移动 "偏移量"字节。
         选项 =2 时, 表示将文件指针指向从文件的尾部,,向前移动 "偏移量"字节。

  五、从文件读取指内容
    1.文本文件(以"rt"方式打开的文件)的读取
      s = f.readline()
      返回值: s 是字符串,从文件中读取的一行,含行结束符。
      说明: (1)如果 len(s) = 0 表示已到文件尾(换行符也是有长度的,长度为2)
            (2)如果是文件的最后一行,有可能没有行结束符
    2.二进制文件(以"rb"、"rb+"、"wb+" 方式打开的文件)的读取
      s = f.read(n)
      说明: (1)如果 len( s ) =0 表示已到文件尾
            (2)文件读取后,文件的指针向后移动 len(s) 字节。
            (3)如果磁道已坏,会发生异常。
    with open('/tmp/passwd', 'r') as f:        使用with可以省略a.close()
            for eachline in f:
                    print eachline
    a.read([size])    返回字符串,以字节为单位
    a.readline([size])  返回字符串,读一行,如果定义了size,有可能返回的只是一行的一部分
    a.readlines([size])   返回列表,包含每一行,如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
    a.fileno()      返回该文件描述符
    a.tell()       返回文件操作标记的当前位置,以文件的开头为原点
    a.next()       返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()
    函数来实现遍历的。
    a.seek(offset[,whence])   将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。
    但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。
    需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾
    a.write(str)         把str写到文件中,write()并不会换行
    a.writelines(seq)    把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
    a.flush()        把缓冲区的内容写入硬盘
    a.isatty()        文件是否是一个终端设备文件(unix系统中的)
    a.truncate([size])   把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,
    依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。


  六、向文件写入一个字符串
      f.write( s )
      参数: s 要写入的字符串
      说明: (1)文件写入后,文件的指针向后移动 len(s) 字节。
            (2)如果磁道已坏,或磁盘已满会发生异常。

  七、常用文件操作参考
      [1.os]
        1.重命名:os.rename(old, new)
        2.删除:os.remove(file)
        3.列出目录下的文件:os.listdir(path)
        4.获取当前工作目录:os.getcwd()
        5.改变工作目录:os.chdir(newdir)
        6.创建多级目录:os.makedirs(r"c:\python\test")
        7.创建单个目录:os.mkdir("test")
        8.删除多个目录:os.removedirs(r"c:\python") #删除所给路径最后一个目录下所有空目录。
        9.删除单个目录:os.rmdir("test")
        10.获取文件属性:os.stat(file)
        11.修改文件权限与时间戳:os.chmod(file)
        12.执行操作系统命令:os.system("dir")
        13.启动新进程:os.exec(), os.execvp()
        14.在后台执行程序:osspawnv()
        15.终止当前进程:os.exit(), os._exit()
        16.分离文件名:os.path.split(r"c:\python\hello.py") --> ("c:\\python", "hello.py")
        17.分离扩展名:os.path.splitext(r"c:\python\hello.py") --> ("c:\\python\\hello", ".py")
        18.获取路径名:os.path.dirname(r"c:\python\hello.py") --> "c:\\python"
        19.获取文件名:os.path.basename(r"r:\python\hello.py") --> "hello.py"
        20.判断文件是否存在:os.path.exists(r"c:\python\hello.py") --> True
        21.判断是否是绝对路径:os.path.isabs(r".\python\") --> False
        22.判断是否是目录:os.path.isdir(r"c:\python") --> True
        23.判断是否是文件:os.path.isfile(r"c:\python\hello.py") --> True
        24.判断是否是链接文件:os.path.islink(r"c:\python\hello.py") --> False
        25.获取文件大小:os.path.getsize(filename)
        26.*******:os.ismount("c:\\") --> True
        27.搜索目录下的所有文件:os.path.walk()
        28.文件的访问时间 :  os.path.getatime(myfile) # 这里的时间以秒为单位,并且从1970年1月1日开始算起
        29.文件的修改时间:  os.path.getmtime(myfile)

      [2.shutil]
        1.复制单个文件:shutil.copy(oldfile, newfle)
        2.复制整个目录树:shutil.copytree(r".\setup", r".\backup")
        3.删除整个目录树:shutil.rmtree(r".\backup")

      [3.tempfile]
        1.创建一个唯一的临时文件:tempfile.mktemp() --> filename
        2.打开临时文件:tempfile.TemporaryFile()

      [4.StringIO] #cStringIO是StringIO模块的快速实现模块
        1.创建内存文件并写入初始数据:f = StringIO.StringIO("Hello world!")
        2.读入内存文件数据: print f.read() #或print f.getvalue() --> Hello world!
        3.想内存文件写入数据:f.write("Good day!")
        4.关闭内存文件:f.close()

      [5.glob]
        1.匹配文件:glob.glob(r"c:\python\*.py")



########### 示例1 运行系统命令行 #################################
    import os
    os_command = 'echo haha...'
    # 运行命令行,返回运行结果(成功时返回0,失败返回1或以上的出错数字)
    result = os.system(os_command)
    if result == 0:
        print('run Successful')
    else:
        print('run FAILED')
    # 注:os.system()函数不推荐使用,它容易引发严重的错误。(可能是因为不具备可移植性)

    #os.system(os_command) # 这命令会弹出一个黑乎乎的cmd运行窗口,而且无法获得输出
    p = os.popen(os_command) # 捕获运行的屏幕输出,以文件类型接收,不再另外弹出窗口
    print(p.read()) # p 是个文件类型,可按文件的操作


########### 杀掉进程(windows) ###########
    def kill(pid):
        """ kill process by pid for windows """
        kill_command = "taskkill /F /T /pid %s" % pid
        os.system(kill_command)


########### 进程监视(windows) ###########

    # 定期监视某进程是否存在,不存在则执行
    import os,time

    def __Is_Process_Running(imagename):
        '''
           功能:检查进程是否存在
           返回:返回有多少个这进程名的程序在运行,返回0则程序不在运行
        '''
        p = os.popen('tasklist /FI "IMAGENAME eq %s"' % imagename) # 利用 windows 批处理的 tasklist 命令
        return p.read().count(imagename) # p 是个文件类型,可按文件的操作

    def test():
        '''
           功能:定期地监视测进程是否还在运行,不再运行时执行指定代码
        '''
        while True:
            time.sleep(10)
            pid = __Is_Process_Running('barfoo.exe')
            if pid <= 0:
                # code .....
                break

    if __name__ == "__main__":
        test()


########### 程序退出时执行 ###########
    import os

    # 运行另外一个进程
    proxy_server = os.popen('cmd.exe /c start "" barfoo_proxy.exe')
    # 等待这个进程结束(其实是读取程序的输出,但程序如果一直不停止的话,就一直阻塞),再往下执行
    proxy_server.read()

    # 前面的程序结束后,才继续执行下面的代码
    test_file = open('test.txt', 'wb')
    test_file.write('hello')
    test_file.close()


########### 示例2 创建目录 #################################
    import os
    pathDir = r'D:\Work' # 不同系统的目录写法有所不同
    if not os.path.exists(pathDir):
        os.mkdir(pathDir) # 创建目录, os.makedirs(pathDir) 创建多个不存在的目录
    target = pathDir + os.sep + 'test.txt'
    print(target)
    # 注意os.sep变量的用法, os.sep 是目录分隔符,这样写方便移植。即在Linux、Unix下它是'/',在Windows下它是'\\',
    而在Mac OS下它是':'。



########### 示例3 文件操作(遍历目录和文件名) ########################
    import os
    import os.path
    rootdir = r"D:\Holemar\1.notes\28.Python\test"
    # os.walk 返回一个三元组,其中parent表示所在目录, dirnames是所有目录名字的列表, filenames是所有文件名字的列表
    for parent,dirnames,filenames in os.walk(rootdir):
        # 所在目录
        print("parent is:" + parent)
        # 遍历此目录下的所有目录(不包含子目录)
        for dirname in dirnames:
           print(" dirname is:" + dirname)
        # 遍历此目录下的所有文件
        for filename in filenames:
           print(" filename with full path:" + os.path.join(parent, filename))

    # 列表显示出某目录下的所有文件及目录(不包括子目录的内容)
    ls = os.listdir(rootdir)


########### 示例4 文件操作(分割路径和文件名) #################################
    import os.path
    #常用函数有三种:分隔路径,找出文件名,找出盘符(window系统),找出文件的扩展名。
    spath = "d:/test/test.7z"

    # 下面三个分割都返回二元组
    # 分隔目录和文件名
    p,f = os.path.split(spath)  # 注意二元组的接收
    print("dir is:" + p)    # 打印: d:/test
    print(" file is:" + f)  # 打印: test.7z

    # 分隔盘符和文件名
    drv,left = os.path.splitdrive(spath)
    print(" driver is:" + drv)   # 打印: d:
    print(" left is:" + left)    # 打印: /test/test.7z

    # 分隔文件和扩展名
    f,ext = os.path.splitext(spath)
    print(" f is: " + f)    # 打印: d:/test/test
    print(" ext is:" + ext) # 打印: 7z


########### 示例4 文件操作(读写txt文件) #################################
    filePath = 'poem.txt'
    f = open(filePath, 'w') # 以写的模式打开文件,Python 2.x 需将 open() / io.open() 改成 file()
    for a in range( 0, 10 ):
        s = "%5d %5d\n" % (a, a*a)
        f.write( s ) # 把文本写入文件
    f.close() # 关闭io流

    f2 = open(filePath) # 没有提供模式,则默认是读取,即 'r'
    while True:
        line = f2.readline()
        if len(line) == 0: # 读取结束
            break
        print(line, end='') # 避免print自动换行, 此行Python2.x应该写:“print line,”
    f2.close() # close the file

    # 删除文件
    import os
    os.remove(filePath)


########### 示例5 文件操作(获取文件修改时间) #################################
    import os,os.path,time
    timestamp = os.path.getmtime(__file__) # 获取本文件
    time_tuple = time.localtime(timestamp)
    print time.strftime('%Y-%m-%d %H:%M:%S', time_tuple) # 2008-11-12 21:59:27
    # 下面简化成一行代码
    print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(__file__))) # 2008-11-12 21:59:27

results matching ""

    No results matching ""