python中文件的遍历、拷贝以及几个版本的小区别

      这几天需要对实验室集群中机器的数据进行处理,借此机会熟悉下python这个语言。实验室集群中机器各异,python版本也很多样化,总共有四个版本。写的程序调成了三种样子,才得以在各个机器上跑完。记录下常用的代码。

一个在2.7中可以运行的代码:

复制代码
import glob
import os
import shutil
import re
outlinkPath="/POOL_Temp_space/xzm/run/"
putPosition="/POOL_Temp_space/lyn/infoMall/allOutlinksFile/"

def fun(path): #path为要遍历的顶端目录路径
    patt=re.compile(r'outlinks.\d+$')
    fileList=[]
    for root, dirs, files in os.walk(outlinkPath):
        for fn in files:
            if patt.match(fn): #用正则表达式筛选文件名
                fileList.append(root+"/"+fn)
    return fileList #返回完整文件路径列表

fileList=fun(outlinkPath)
for filePath in fileList:
    fileName=''
    for c in filePath:
        if not (c.isalpha() or c.isdigit()):
            fileName+='_'
        else:
            fileName+=c
    if not os.path.exists(putPosition):
        os.makedirs(putPosition)
    open(putPosition+fileName,'w') #2.7中可以不用这句,下一局会自动建立文件,但是2.6中需要在没有此文件时先建立下
    shutil.copyfile(filePath,putPosition+fileName) #将filePath文件拷贝到相应位置
复制代码

os.walk() 较低版本的python不支持,所以写了一个在2.2中可以运行的代码,如果在2.3中运行,需要去掉第一句话:

复制代码
from __future__ import generators #2.2需要加此句才可以用yield,更高版本的不用此句
import glob
import os
import shutil
import re
import sys
outlinkPath="/POOL_Temp_space/xzm/run/"
putPosition="/POOL_Temp_space/lyn/infoMall/allOutlinksFile/"

fileList=[]

def walktree(top = ".", depthfirst = True): #递归的遍历
    try:
        import stat, types
        names = os.listdir(top)
        if not depthfirst:
                yield top, names 
        for name in names:
                try:
                        st = os.lstat(os.path.join(top, name))
                except os.error:
                        continue
                if stat.S_ISDIR(st.st_mode):
                        for (newtop, children) in walktree (os.path.join(top, name), depthfirst):
                                yield newtop, children
        if depthfirst:
                yield top, names
    except os.error:
        yield top, []
patt=re.compile('outlinks.\d+$')
if not os.path.exists(putPosition):
        os.makedirs(putPosition)

for top, names in walktree(outlinkPath):#遍历生成的文件元组
        for name in names:
                filePath=top+'/'+name
                if not patt.match(name):
                        continue
                fileName=''
                for c in filePath:
                        if not (c.isalpha() or c.isdigit()):
                                fileName+='_'
                        else:

                                fileName+=c
                open(putPosition+fileName,'w')
                shutil.copyfile(filePath,putPosition+fileName)
复制代码

 

posted on   liugoodness  阅读(379)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2012年5月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

统计

点击右上角即可分享
微信分享提示