设为首页 加入收藏

TOP

Python文件和目录操作实例代码(二)
2015-02-02 14:27:43 来源: 作者: 【 】 浏览:39
Tags:Python 文件 目录 操作 实例 代码
移动文件。这里,将myfile移动到目录d下面:
os.rename(myfile, os.path.join(d, myfile))
在跨文件系统移动文件时,可以先使用shutil.copy2来复制文件,然后再删除原来的副本即可,如下:
shutil.copy2(myfile, os.path.join(d, myfile))
os.remove(myfile)
后面这种移动文件的方法是最安全的。


六、目录的创建和移动
Os模块中的函数mkdir可以用来创建目录,而chdir函数则可以移动目录,如下:
origdir = os.getcwd() # 将当前位置记下来
newdir = os.path.join(os.pardir, 'mynewdir')
if not os.path.isdir(newdir):
os.mkdir(newdir) # 或者os.mkdir(newdir,'0755')
os.chdir(newdir)
...
os.chdir(origdir) # 返回原目录
os.chdir(os.environ['HOME']) # 移到主目录
假设想要在自己的主目录下创建一个新目录py/src/test1,但是目前py、src和test1都不存在。如果使用mkdir命令来创建的话,需要使用三次才能建好这个嵌套的目录,但是使用Python语言提供的os.makedirs命令的话,则无需这样麻烦了,该命令可以一次建好整个目录:
os.makedirs(os.path.join(os.environ['HOME'],'py','src','test1'))


七、遍历目录树
下面的函数调用
os.path.walk(root, myfunc, arg)
将遍历root目录树;然后,对每个目录名dirname分别调用myfunc(arg, dirname, files)即可,这里参数files是dir中的文件名列表(可通过调用os.listdir(dirname)来获得);arg是用户从调用代码中传递来的参数。对于UNIX操作系统用户来说,Python语言中跨平台的os.path.walk相当于Unix命令find。
在解释os.path.walk的用法时,人们常使用写出主目录中所有子目录内的文件的名称为例进行说明。当然,也可以在一个交互式的Python命令行中使用下列代码段来体会os.path.walk的使用:
def ls(arg, dirname, files):
print dirname, 'has the files', files
os.path.walk(os.environ['HOME'], ls, None)
本例中,参数arg并非必需,所以在os.path.walk调用中让其取值为None即可。
为了列出主目录中所有大于1Mb的文件,可以使用下面的代码:
def checksize1(arg, dirname, files):
for file in files:
filepath = os.path.join(dirname, file)
if os.path.isfile(filepath):
size = os.path.getsize(filepath)
if size > 1000000:
size_in_Mb = size/1000000.0
arg.append((size_in_Mb, filename))
bigfiles = []
root = os.environ['HOME']
os.path.walk(root, checksize1, bigfiles)
for size, name in bigfiles:
print name, '大小为', size, 'Mb'


现在,使用arg来建立一个数据结构,这里是一个2元组构成的列表,其中每个2元组存放文件的尺寸(以MB为单位)和完整的文件路径。如果用于所有目录的函数调用中都要更改arg的话,那么arg必须是一个可变的数据结构,即允许适当地进行修改。
参数dirname是当前正在访问的目录的绝对路径,而参数files内的文件名则是相对于dirname的相对路径。在此期间,当前工作目录并没有改变,那就是说该脚本仍然呆在脚本启动时刻所在的目录中。这就是为什么需要把filepath弄成带有dirname和file的绝对路径的原因。若要改变当前工作目录为dirname,只要在针对每个目录调用os.path.walk的函数中调用一下os.chdir(dirname),然后在该函数的末尾重新调用os.chdir(dirname)将当前工作目录改回原值即可,如下所示:
def somefunc(arg, dirname, files):
origdir = os.getcwd(); os.chdir(dirname)


os.chdir(origdir)
os.path.walk(root, somefunc, arg)
当然,如果您愿意也可以编写具有类似功能的代码来替代os.path.walk。下面的代码,将针对每个文件而非每个目录来调用的自定义函数,如下所示:
def find(func, rootdir, arg=None):
# 对rootdir目录中的每个文件调用func
files = os.listdir(rootdir) # 获取rootdir目录中的所有文件
files.sort(lambda a, b: cmp(a.lower(), b.lower()))
for file in files:
fullpath = os.path.join(rootdir, file)
if os.path.islink(fullpath):
pass
elif os.path.isdir(fullpath):
find(func, fullpath, arg)
elif os.path.isfile(fullpath):
func(fullpath, arg)
else:
print 'find: cannot treat ', fullpath
上面的函数find可以从scitools模块中获取。与内置函数os.path.walk相反,的find函数以大小写敏感的字母顺序来访问文件和目录。
可以使用find函数来列出所有大于1Mb的文件:
def checksize2(fullpath, bigfiles):
size = os.path.getsize(fullpath)
if size > 1000000:
bigfiles.append('%.2fMb %s' % (size/1000000.0, fullpath))
bigfiles = []
root = os.environ['HOME']
find(checksize2, root, bigfiles)
for fileinfo in bigfiles:
print fileinfo
参数arg带来了巨大的灵活性。可以使用它来同时存放输入数据和生成的数据结构。下一个范例将收集所有大于一定尺寸的带有规定扩展名的文件的文件名和大小。输出的结果按照文件大小排列。
bigfiles = {'filelist': [], # 文件名和大小列表
'extensions': ('.*ps', '.tiff', '.bmp'),
'size_limit': 1000000, # 1 Mb
}
find(checksize3, os.environ['HOME'], bigfiles)
def checksize3(fullpath, arg):
treat_fil

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python库urllib与urllib2有哪些区.. 下一篇Python文件和目录操作函数总结

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: