《转》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' | 
| 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",\n
            在该目录下创建一个名为"readme.txt"的文本文件,写入数据,然后输出文件内容\n
            (2):如果文件夹BeginMan存在,则遍历该目录,并输入目录文件\n,
            如果该目录下存在文件,且如果有文件名为b.png,则重命名为boy.png,移到D盘根目录下\n
            (3):删除BeginMan目录下所有文件,只保留子目录
            ==============================================\n
            时间:%s\n
            作者:%s\n
            """ %(datetime.datetime.now(),FILENAME)
if FILENAME in os.listdir(DIR):
        print u'已经有同名文件:%s' %FILENAME
        for obj in os.listdir(PATH):
            print  u'%s\\%s\n' %(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有关文件、文件夹操作小结:
| importos,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:\Project\python25\Lib | 
| 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() | 指定路径是否存在且为一个挂载点 两个路径名是否指向同个文件 | 
 
                    
                

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号