文件备份和文件归类整理程序python

文件备份程序代码如下:

import os,json

def back_up(old_name):
    len_ = old_name.rfind(".")  # 以右边第一个"."为分界线,寻找从右向左的字符串长度
    if len_ > 0 and os.path.exists(old_name):
        ext = old_name[len_:]
        new_name = old_name[:len_]+"(back-up)"+ext # 命名备份文件

        with open(new_name, "wb") as f1:
            with open(old_name, "rb") as f2:
                f1.write(f2.read())
    else:
        print(f"can't find {old_name}")

back_up(input("name of txt file:"))

该程序一共分两个部分。1,给备份文件起名字 2,把文件内容复制到备份文件中。

我们先看第一部分。首先变量ext是该文件的扩展名(用切片将属于主文件名长度到总文件名长度内的元素取出来组成新的字符串)。比如若文件名是'program.sub.txt',那么 len_=11ext='.txt'new_name是备份文件名字。我们能看出,如果按照这个方法起备份名的话,当文件名为"program.sub.txt"时,new_name就是program.sub(back-up).txt

我们来看看第二部分。第二部分比较简单,就是通过文件的读取写入将旧文件中的内容复制到新文件来了。其中rbwb就是read and writebinary(二进制)形式,在这里可以提高读取准确性。顺便提个醒,这个备份程序理论上说只能备份文本文件,想要备份其他类型的文件像json, jpg这样的还需要再重新写一个子程序,比较麻烦,不过内容也都大同小异。我这里就先提供一类,剩下的就交给大家创造了!


文件归档整理程序代码如下:

import os,shutil

def clear(Dr,dr):
    if not os.path.exists(Dr):
        print(f"{Dr} not founded")
        time.sleep(1)
        os._exit(0)
    abdir1 = os.path.abspath(dr)
    abdir2 = os.path.abspath(Dr)
    if not os.path.exists(dr):
        os.mkdir(dr)  # 创建新文件夹

    files = os.listdir(Dr)  # 获取文件列表
    ext_set = [".png", ".jpg", ".bmp", ".jpeg", ".gif"]
    for i in files:
        Dir=abdir2+os.sep+i
        if os.path.isdir(Dir):
            clear(Dir, dr)  # 使用递归,如果判断是文件夹则再次执行clear()函数直到判断出是文件
        ext = os.path.splitext(i)[-1]
        if ext in ext_set:
            shutil.copy(Dir,abdir1)  # shutil.move()也可以
        
    if dr not in os.listdir(Dr):
        shutil.move(dr, Dr)


clear("al technology tentative","image")

首先了解一下splitext()(全名split extension)。相比于split(),他总能分出扩展名和主文件名,而split()只能将对象以某个特征简单分割成数个元素并组成列表suffix=os.path.splitext("ab.a.png") 运行结果是:["ab.a",".png"],而split()的效果是:["ab","a","png"]。另外os.path.aspath()能够读取一个文件的绝对路径。

上面这段实现文件归档整理的程序由几部分组成。1.判断主文件夹Dr是否存在。在这个程序里需要注意os.mkdir(dr),如果dr已经存在,程序就会报错,所以还需要先判断dr是否存在再做下一步打算 2.将Dr中符合要求的文件复制到另一个文件夹dr中。

先看第一步,我们用os.path.exists(Dr)判断主文件是否存在。如果连主文件都不存在,那就可以直接用os._exit(0)方法停止执行下面的程序了,反正让他执行也会报错,还不如让程序体面一点,不要那么多红叉叉。

第二部比较有意思。files=os.listdir(Dr)获取了主文件夹Dr中的文件夹和文件。由于我们的判断对象是文件,所以如果判断出是文件夹,这段程序就使用递归再次执行clear()函数并增加其路径长度直到判断出是文件。就像打开俄罗斯套娃一样,如果我们想拿到最里面的套娃该怎么办?我们需要一套一套的打开套娃,直到下一个娃无法再被打开,“娃中无娃”了为止。这段程序和打开俄罗斯套娃很相像,只是说程序在打开套娃的时候相当于是在套娃身上戳一个洞,如果感觉里面是空的(说明“娃中有娃”),就继续戳,同时记录:戳了一层,这样在第二次戳的时候就知道自己要戳的是第二层。在这里,层数总的增加记录可以看作变量Dir,也就是路径增长的记录;os.sep+i 则可以当作是新增的层。大家可以把每次的Dir打印出来便于理解。

接下来就是用in成员操作符判断文件扩展名ext(= os.path.splitext(i)[-1])是否在列表ext_set里。这一步是把图片文件整理了出来——若该文件有图片的扩展名,shutil.copy(Dir,abdir1)就把文件路径Dir复制到图片文件夹dr的绝对路径中。(另外一个shutil.move()是移动文件)最后一步把文件夹dr移动到主文件夹Dr的绝对路径中。clear()函数代码讲解完毕

注:第15行没有用"/"分隔符来隔开路径的每一级,因为不同系统下有不同的分隔符,为了通用性就使用os.sep方法-他到不同系统中会采用相应的分隔符,蛮智能的。


版权声明:本文为jimmy1881415157原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。