zoukankan      html  css  js  c++  java
  • 《转》Python学习(15)-对文件的操作(二)

    转自 http://www.cnblogs.com/BeginMan/p/3169020.html

    一、文件系统

    从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

    Python对文件系统的操作是通过os模块实现。提供了访问操作系统功能的接口,但是这个os模块只是一个伪文件系统操作,真正的“模块”如,dos,os2等,这些是直接的底层工作,而Python的os模块只是一种借用操作(个人理解)

    os.path模块可对路径进行相关操作。

    os、os.path这两个模块与平台、操作系统无关。

     二、os模块的文件/目录访问函数

    函数描述
    文件处理  
    mkfifo()/mknod() 创建命名管道/创建文件系统节点
    remove(path)/unlink(path) 删除文件 如:os.remove('d:\b.png')
    rename(old, new)/renames(old, new)  重命名文件:如:os.rename('d:\b.png','d:\a.png')
    stat(path)  返回文件信息:
    >>> os.stat('d:\a.png')
    (33206, 0L, 0, 0, 0, 0, 4088L, 1372746141, 1372734171, 1372746141)
    >>> 
    symlink()  创建符号链接
    utime()   更新时间戳
    tmpfile()  创建并打开('w+b')一个新的临时文件,注意不含参数,一旦执行则创建一个临时文件,类型未知
    >>> os.tmpfile()#创建临时文件
    <open file '<tmpfile>', mode 'w+b' at 0x011D4BF0>
    >>> os.rename('d:\t58g.2','d:\abc.txt')#改成txt
    walk(top, topdown, onerror)  生成一个目录树下所有文件名
    目录/文件夹  
    chdir(path)  改变当前工作目录
    listdir(path)  列出指定目录文件
    >>> os.listdir('d:\')
    ['a.png', 'abc.txt', 'out.txt', 'Program Files', 'Python25', 'RECYCLER',]>>> 
    getcwd()/getcwdu()  返回当前目录:
    >>> os.getcwd()
    'D:\Python25'
    >>> os.getcwdu()
    u'D:\Python25
    mkdir(path)/makedirs(name, mode) 创建目录/创建多层目录
    >>> os.mkdir('D:\file')

    rmdir(path)/removedirs(name)  删除目录/删除多层目录
    访问/权限  
    access(path, mode)  验证权限目录
    chmod(path, mode)  更改权限模式
    文件描述符操作  
    open()、read()、write()  见上一节
    dup()/dup2()  复制

     其他的见《Python 核心编程2》9.7节

    应用:

    (1):检查下磁盘中(D)是否有文件"BeginMan"的文件夹,如果存在则新建"SuperMan",
                在该目录下创建一个名为"readme.txt"的文本文件,写入数据,然后输出文件内容
    (2):如果文件夹BeginMan存在,则遍历该目录,并输入目录文件,
                如果该目录下存在文件,且如果有文件名为b.png,则重命名为boy.png,移到D盘根目录下
      (3):删除BeginMan目录下所有文件,只保留子目录

    文件系统图如下:

    D盘中并没有SuperMan的文件夹,这里程序如下:

    #coding=utf-8
    import os,shutil
    import datetime
    
    DIR = 'D:\'
    FILENAME = 'BeginMan'
    PATH = 'D:\%s' %FILENAME
    CONTENT = """
                (1):检查下磁盘中(D)是否有文件"BeginMan"的文件夹,如果存在则新建"SuperMan",
    
                在该目录下创建一个名为"readme.txt"的文本文件,写入数据,然后输出文件内容
    
                (2):如果文件夹BeginMan存在,则遍历该目录,并输入目录文件
    ,
                如果该目录下存在文件,且如果有文件名为b.png,则重命名为boy.png,移到D盘根目录下
    
                (3):删除BeginMan目录下所有文件,只保留子目录
                ==============================================
    
                时间:%s
    
                作者:%s
    
                """ %(datetime.datetime.now(),FILENAME)
    
    if FILENAME in os.listdir(DIR):
            print u'已经有同名文件:%s' %FILENAME
            for obj in os.listdir(PATH):
                print  u'%s\%s
    ' %(PATH,obj)
                try:
                    if os.path.isfile(u'%s\%s' %(PATH,obj)):
                        if obj == 'b.png':  #如果含有文件为b.png,则重命名为boy.png,移动到该目录上级
                            os.rename(u'%s\%s' %(PATH,obj),u'%s\%s' %(PATH,'boy.png'))
                            shutil.move(u'%s\%s' %(PATH,'boy.png'), 'D:\')
                        os.remove(u'%s\%s' %(PATH,obj))#删除文件,只保留子目录
                except Exception,e:
                    print 'The error:%s' %e
            FILENAME = 'SuperMan'
            os.mkdir('D:\%s' %FILENAME)                    #创建目录
            f = open('D:\%s\readme.txt'%FILENAME,'w' )    #在该目录下创建文件
            f.write(CONTENT)                                #写入数据
            f.close()
            f = open('D:\%s\readme.txt'%FILENAME,'r' )
            print [lines.strip() for lines in f]            #输出

    运行如下:

    效果如下:

    Python有关文件、文件夹操作小结:

    import os,shutil  #要用到这两个模块
     
    创建文件:
    1) os.mknod("test.txt") 创建空文件
    2) open("test.txt",w)           直接打开一个文件,如果文件不存在则创建文件
     
    创建目录:
    os.mkdir("file")                   创建目录
     
    复制文件:
    shutil.copyfile("oldfile","newfile")       oldfile和newfile都只能是文件
    shutil.copy("oldfile","newfile")            oldfile只能是文件夹,newfile可以是文件,也可以是目标目录
     
    复制文件夹:
    shutil.copytree("olddir","newdir")        olddir和newdir都只能是目录,且newdir必须不存在
     
    重命名文件(目录)
    os.rename("oldname","newname")       文件或目录都是使用这条命令
     
    移动文件(目录)
    shutil.move("oldpos","newpos")  
     
    删除文件
    os.remove("file")
     
    删除目录
    os.rmdir("dir") 只能删除空目录
    shutil.rmtree("dir")    空目录、有内容的目录都可以删
     
    转换目录
    os.chdir("path")    换路径
     
    判断目标
    os.path.exists("goal")    判断目标是否存在
    os.path.isdir("goal")     判断目标是否目录
    os.path.isfile("goal")    判断目标是否文件    参考:http://www.cnblogs.com/phoebus0501/archive/2011/01/19/1939646.html

     三、os.path

    如下表:

     函数描述
     分隔  
     basename(p)  去掉目录路径, 返回文件名:
    os.path.basename('D:\Project\python25\Lib\a.txt') #a.txt
     dirname(p)  去掉文件名, 返回目录路径:
    os.path.dirname(D:\Project\python25\Lib\a.txt)
    #D:Projectpython25Lib
     join()  将分离的各部分组合成一个路径名:Django项目中常用,
    settings.py
    DIRNAME = os.path.dirname(__file__)
    TEMPLATE_DIRS = (
         os.path.join(DIRNAME, "themes"),
    )
     split()  返回 (dirname(), basename()) 元组:
    >>>DIRNAME = 'D:\Project\python25\Lib\a.txt'
    >>>os.path.split(DIRNAME)
    ('D:\Project\python25\Lib', 'a.txt')
     splitdrive()  返回 (drivename, pathname) 元组:
    os.path.splitdrive(DIRNAME)
    #('D:', '\Project\python25\Lib\a.txt')
     splitext()  返回 (filename, extension) 元组
    os.path.splitext(DIRNAME) 
    #('D:\Project\python25\Lib\a', '.txt')
     信息  
     getatime(filename)  返回最近访问时间:
    gTime =  os.path.getatime(os.getcwd())
    print gTime  #1372836299.77
    tTime = time.localtime(gTime)
    print time.strftime('%Y-%m-%d %H:%M:%S',tTime)  #2013-07-03 15:24:59
    getctime(filename)  返回文件创建时间:
    cTime = os.path.getctime(os.getcwd())
    c_time = time.localtime(cTime)
    print time.strftime('%Y-%m-%d %H:%M:%S',c_time) #2013-04-17 17:27:46
     getmtime(filename)  返回最近文件修改时间
     getsize(filename) 返回文件大小(以字节为单位)
     查询  
     exists()  指定路径(文件或目录)是否存在
     isabs()  指定路径是否为绝对路径
     isdir()  指定路径是否存在且为一个目录
     isfile()  指定路径是否存在且为一个文件
     islink()  指定路径是否存在且为一个符号链接

     ismount()

    samefile()

     指定路径是否存在且为一个挂载点

    两个路径名是否指向同个文件

  • 相关阅读:
    PAT B1027 打印沙漏 (20 分)
    PAT B1025 反转链表 (25 分)
    PAT B1022 D进制的A+B (20 分)
    PAT B1018 锤子剪刀布 (20 分)
    PAT B1017 A除以B (20 分)
    PAT B1015 德才论 (25 分)
    PAT B1013 数素数 (20 分)
    PAT B1010 一元多项式求导 (25 分)
    HDU 1405 The Last Practice
    HDU 1165 Eddy's research II
  • 原文地址:https://www.cnblogs.com/nolonely/p/6626208.html
Copyright © 2011-2022 走看看