Python3 文件处理相关脚本

对文件相关处理是脚本中最常见的,下面列举几种实用的案例:

批量删除:

(1)删除指定目录,指定后缀文件

例:删除目录J:/start下的 .log与.tmp结尾文件

def del_files(path, filters):
    if os.path.exists(path) and os.path.isdir(path):
        for root, dirs, files in os.walk(path):
            for name in files:  # name.find(".tmp")>0
                for subfix in filters:
                    if name.endswith(subfix):
                        os.remove(os.path.join(root, name))
                        print ("Delete File: " + os.path.join(root, name))

def test_del_files():
    filters = [".log",".tmp"]
    del_files("J:/StartUML",filters)

(2)只保留特定文件

def del_all(dir, retain_file):
    if os.path.exists(dir) and os.path.isdir(dir):
        dir_content = [x for x in os.listdir(dir) if x != retain_file]
        for f in dir_content:
            fpath = os.path.join(dir, f)
            if os.path.isdir(fpath):
                shutil.rmtree(fpath)
            else:
                os.remove(fpath)

 del_all("J:/StartUML","11.txt")

批量复制与移动:

(1)复制处理:

#方案一
def copy_all(sourceDir,targetDir):
    if os.path.exists(sourceDir):
        for file in os.listdir(sourceDir):
            sourceFile = os.path.join(sourceDir, file)
            targetFile = os.path.join(targetDir, file)
            if os.path.isfile(sourceFile):
                if not os.path.exists(targetDir):
                    os.mkdir(targetDir)
                # 如果目的路径里面不存在某个文件或者存在那个同名文件但是文件有残缺,则复制,否则跳过
                if not os.path.exists(targetFile) or                         (os.path.exists(targetFile) and (os.path.getsize(targetFile) != os.path.getsize(sourceFile))):
                    shutil.copy(sourceFile,targetFile)
            if os.path.isdir(sourceFile):
                copy_all(sourceFile, targetFile)

#方案二
def copy_files(src_dir,dest_dir,isonelevel):
    if os.path.exists(src_dir) and os.path.isdir(src_dir):
        if not os.path.exists(dest_dir):
             os.mkdir(dest_dir)
        for parent, dirnames, filenames in os.walk(src_dir):
            # if parent.startswith(src_dir):
            if isonelevel:
                dstdir = dest_dir
            else:
                dstdir = parent.replace(src_dir,dest_dir,1)
            for dirname in dirnames:
                os.mkdir(os.path.join(dstdir,dirname))
            for fname in filenames:
                shutil.copy(os.path.join(parent, fname), os.path.join(dstdir, fname))

# copy_all("J:/ZIMU","J:/StartUML")

(2)移动处理

#walk遍历处理实现
def move_files(src_dir, dst_dir):
    if os.path.exists(src_dir) and os.path.isdir(src_dir):
        if not os.path.exists(dst_dir):
            os.mkdir(dst_dir)
        for pdir ,dirs, fnames in os.walk(src_dir,topdown=True):
            newdstdir = pdir.replace(src_dir,dst_dir,1)
            if not os.path.exists(newdstdir):
                os.mkdir(newdstdir)
            for fn in fnames:
                os.rename(os.path.join(pdir,fn),os.path.join(newdstdir,fn))
            for dir in dirs:
                dstSource = os.path.join(newdstdir,dir)
                if not os.path.exists(dstSource):
                    os.mkdir(dstSource)
        shutil.rmtree(src_dir)

#递归实现
def move_recursive(sourceDir,targetDir):
    if os.path.exists(sourceDir):
        for file in os.listdir(sourceDir):
            sourceFile = os.path.join(sourceDir, file)
            targetFile = os.path.join(targetDir, file)
            if not os.path.exists(targetDir):
                os.mkdir(targetDir)
            if os.path.isfile(sourceFile):
                os.rename(sourceFile,targetFile)
            elif os.path.isdir(sourceFile):
                move_recursive(sourceFile,targetFile)

def move_all(sourceDir,targetDir):
    move_recursive()
    shutil.rmtree(sourceDir)

# move_all("J:/StartUML/AGirls","J:/StartUML/ABoys")

搜索与查找:

(1)查找指定文件名称文件

# 指定目录及其子目录中查找文件名含有关键字的文件
def search_file_pattern_name1(path, word):
    for filename in os.listdir(path):
        fp = os.path.join(path, filename)
        if os.path.isfile(fp) and word in filename:
            print(fp)
        elif os.path.isdir(fp):
            search_file_pattern_name1(fp, word)

# search_file("J:/AndroidSrc4.2/packages" ".png")
def search_file_pattern_name2(dirname,keyworld):
    results = []
    for root, dirs, files in os.walk(dirname):
        results += [os.path.relpath(os.path.join(root, x), start = dirname) for x in files  if keyworld in x]
    for result in results:
        print(result)

(2)查找文本内容包含指定关键词的所以文件,输出该文件路径

def search_file_txtcontent1(dir, word,isaccurate):
    if os.path.exists(dir):
        for filename in os.listdir(dir):
            fp = os.path.join(dir, filename)
            if os.path.isfile(fp):
                with open(fp) as f:
                    num = 0
                    for line in f:
                        num += 1
                        if word in line:
                            if isaccurate:
                                dSearch = line.split()
                                for search_word in dSearch:
                                    if search_word == word:
                                        print ("accurate find word ", "fileneme=",filename, " line =" , num)
                            else:
                                print ("blur find word ", "fileneme=", filename, " line =", num)
                                # break
            elif os.path.isdir(fp):
                search_file_txtcontent1(fp, word,isaccurate)

# search_file_txtcontent1("J:/AndroidSrc4.2/packages/apps/Launcher2" ,"onCreate",False)

# fileinput模块可以遍历文本文件的所有行.它的工作方式和readlines很类似,不同点在于,
# 它不是将全部的行读到列表中而是创建了一个xreadlines对象.
def search_file_txtcontent2(dir_path,searchKey,isaccurate):
    # pattern = "\d{3}-\d{3}-\d{4}" # 如800-333-1212
    if os.path.exists(dir_path):
        for pdir, subdirs, subfiles in os.walk(dir_path):
            for fname in subfiles:
                fn = os.path.join(pdir,fname)
                if os.path.splitext(fn)[1] == ".java":
                    finput = fileinput.input(fn)
                    for eachline in finput:
                        if isaccurate:
                            for m in re.finditer(r"\bonCreate\b", eachline):
                                if m.group(0):
                                    print("accurate find ============")
                                    print (‘filename:‘, fileinput.filename(), ‘line:‘, fileinput.lineno(), eachline)
                        else:
                            a = re.search(searchKey, eachline)
                            if a:
                                print("============")
                                print (‘filename:‘, fileinput.filename(), ‘line:‘, fileinput.lineno(), eachline)

# search_file_txtcontent2("J:/AndroidSrc4.2/packages/apps/Launcher2","onCreate",True)

(3)文本替换处理,将文本内指定原内容替换为新的内容

#方案一,单文件处理
def search_replace_content(src_file, oldWorld, newWorld):
    if os.path.exists(src_file):
        # print("tempfile name is", "=>", file)  # TemporaryFile创建的临时文件的名字
        if os.path.exists(src_file):
            fopen = open(src_file, ‘r‘)
        else:
            print("file %s not found" % src_file)
            sys.exit()

        temp_file = tempfile.mktemp()
        file_dst = open(temp_file, ‘w+b‘)  # 打开临时文件
        for line in fopen:
            line = re.sub(oldWorld, newWorld, line)
            file_dst.write(line)  # 把替换后的内容写入到临时文件中
        fopen.close()
        file_dst.seek(0)
        file_dst.close()

        if os.path.exists(src_file):
            os.remove(src_file)
        shutil.copy(temp_file, src_file)  # copy临时文件到原文件
        try:
            os.remove(temp_file)  # 删掉临时文件
        except OSError:
            pass

#方案二,多文件处理
def search_replace_bigtxt(dir_search,oldKey, newKey):
    for parent_dir, subdirs, files in os.walk(dir_search):
        for file in files:
            fname = os.path.join(dir, file)
            inFile = codecs.open(fname, "r", "utf-8")
            outFile = codecs.open(fname + ".new", "w", "utf-8")
            for line in inFile:
                newline = line.replace(oldKey, newKey)
                outFile.write(newline)
            inFile.close()
            outFile.close()
            os.rename(fname + ".new", fname)

多组词替换处理

def easy2_replace_txt():
    replacements = {‘zero‘: ‘0‘, ‘temp‘: ‘bob‘, ‘garbage‘: ‘nothing‘}
    with open(‘path/to/input/file‘) as infile, open(‘path/to/output/file‘, ‘w‘) as outfile:
        for line in infile:
            for src, target in replacements.items():
                line = line.replace(src, target)
            outfile.write(line)
时间: 2024-09-27 17:16:36

Python3 文件处理相关脚本的相关文章

将 Python3 文件打包成 exe 文件

我们用 Python 写好的代码,如何给别人在没有配置 Python 环境的情况下直接使用呢?尤其是面向 windows 众. 因为 Python 是一门解释性的语言,离开了 Python 解释器,Python 无法执行.但是我们还有相应的解决方案,答案就是打包成 .exe 可执行文件 当然这篇正文前废话两句,一是看过之前网上的一些吐槽,因为没有学过编译原理,所以也不能不懂乱讲,姑且称之为半引用吧: Python 的哲学是所见即所得,脚本类语言也注定了其加密性不如其他编译生成的语言(比如C++,

Linux(5)、文件内容相关命令

文件内容相关 新增内容 vim 模式化编辑器.全屏编辑器 centos7安装vim:yum -y install vim 三种模式 1.编辑模式,打开vim后默认的模式,没卵用: 2.插入模式,直接可以修改文本内容: 3.末行模式,可以使用命令操作文本内容: :10d 删除第10行 :10,20d 删除第10行-20行 模式之间转换: 编辑模式 --> 输入模式: i 在当前光标所在字符前面进入输入模式 a 在当前光标所在字符后面进入输入模式 o 在当前光标所在行的下方新建一行,并转换为输入模式

maven资源文件的相关配置

https://www.cnblogs.com/pixy/p/4798089.html https://blog.csdn.net/u011900448/article/details/78281269 https://www.cnblogs.com/hi-feng/p/7892724.html maven资源文件的相关配置构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件.src/main/java和src/test/java 这两个目录中的

二、shell文件权限和脚本执行

一.认识权限和用户管理 1.查看权限 权限类型: 1.r 读 2.w 写 3.x 可执行 Linux用户 1.所有者(u) 2.所属组(g) (所有者及所有者所在组的全部用户) 3.其他用户(o)(其他组的所有用户(包括文件所有者)) 4.所有用户(a) 文件权限解读 文件类型 所有者权限  所属组权限  其他用户权限            所有者  用户所在的组  文件大小  创建时间  文件名 [[email protected] ~]# ll 总用量 100 -rw-------. 1 r

在Ubuntu宿主机上查看ARM交叉编译好的可执行程序和库文件的相关依赖关系,类似于PC上的ldd命令

在电脑上安装的Linux系统中,有一个ldd命令,可以查看对应的可执行文件或库文件依赖哪些库,但可执行文件或库文件要求与操作系统的编译器类型相同,即电脑是X86的GCC编译器,那么无法通过ldd命令查看ARM交叉编译器编译出来的可执行文件或库文件. 如果想在Ubuntu等Linux宿主机上查看ARM交叉编译好的可执行程序和库文件的相关依赖关系,可以通过以下命令: [email protected]:$ arm-linux-readelf  -a  busybox |grep "Shared&qu

iOS文件路径相关的方法

文件路径相关的方法在NSPathUtilities中,主要是操作路径 获得一个路径 NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; //获得Document的路径<pre name="code" class="objc">//---~~~/Application/

一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本

摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 @for&ever 2010-07-03 功能: 获取指定目录下面符合一定规则的文件名称和文件修改时间,并保存到指定的文件中 脚本如下: #!/usr/bin/env python# -*- coding: utf-8 -*- '''Created on 2010-7-2 @author: fore

重新发现Oracle太美之awr相关脚本简单介绍

大家知道在$ORACLE_HOME/rdbms/admin下,有如下的相关脚本(我的环境为11.2.0.4.2): [[email protected] ~]$ cd $ORACLE_HOME/rdbms/admin [[email protected] admin]$ ls -ltr awr* -rw-r--r-- 1 oracle oinstall  1999 Oct 24  2003 awrrpt.sql -rw-r--r-- 1 oracle oinstall 49166 Sep  1

性能测试相关脚本

1,restime统计响应时间 #!/bin/bash #统计日志响应时间用 if [ $# -lt 1 ]; then echo "at least have one param; " echo "ex: restime a.log b.log *.log" exit 1 fi . lgq_config.sh for((i=1;i<=$#;i++));do opt=`echo ${!i} | grep "^\-F" | awk -F&qu