关于os模块的复制上的应用分享

本质是笔者的一次作业(非计算机专业),包含了不定长参数的函数调用等有意思的地方,或者说这也是笔者觉得这次最有意思的地方,在(3)的加粗字体附近,觉得这个很有意思遂与诸君分享,也是给自己留留回忆,有诸多不足,还请大佬们多多指教!

利用关于os模块关于文件遍历与操作的知识,完成如下工作:

(1)根据图中标红的两个数字对文件进行分组,为每个分组分别建立一个文件夹,分别将文件复制到对应的分组文件夹中。

拷贝文件使用如下函数:

def copy_file(src,target):
    with open(src,'rb') as stream:
        data = stream.read()
        with open(target,'wb') as writer:
            writer.write(data)
#copy_file('E:/python_files/Ku/D2_zhitu_test2.py',"D:/桌面/D2_find_num316.py") 使用格式

(2)编写一个xcopy_fle函数,可以接受多个参数,将指定目录中

的多个指定文件拷贝到另外的指定目录。请使用不定长参数实现。

(3)copy_fle和xcopy_file函数形成一个独立的(pakage),尝试

import,并测试其功能。

............................................................................................................................................................

  • (1)简单粗暴版

(最后结合(2)(3)问成果重新写了一个更加简洁舒服的,可以翻到最后看!)

import os
os.chdir("E:\python_files\py06_411\save")

def copy_file(src,target):
    with open(src,'rb') as stream:
        data = stream.read()
        with open(target,'wb') as writer:
            writer.write(data)

os.mkdir("N06")
for pth in os.listdir():
    if("-06" in pth):
        print(pth)
        copy_file(os.path.join(r"E:\python_files\py06_411\save",pth),os.path.join(r"E:\python_files\py06_411\save\N06",pth))
os.mkdir("N07")
for pth in os.listdir():
    if("-07" in pth):
        print(pth)
        copy_file(os.path.join(r"E:\python_files\py06_411\save",pth),os.path.join(r"E:\python_files\py06_411\save\N07",pth))

os.mkdir("N08")
for pth in os.listdir():
    if("-08" in pth):
        print(pth)
        copy_file(os.path.join(r"E:\python_files\py06_411\save",pth),os.path.join(r"E:\python_files\py06_411\save\N08",pth))

os.mkdir("N09")
for pth in os.listdir():
    if("-09" in pth):
        print(pth)
        copy_file(os.path.join(r"E:\python_files\py06_411\save",pth),os.path.join(r"E:\python_files\py06_411\save\N09",pth))

os.mkdir("N16")
for pth in os.listdir():
    if("-16" in pth):
        print(pth)
        copy_file(os.path.join(r"E:\python_files\py06_411\save",pth),os.path.join(r"E:\python_files\py06_411\save\N16",pth))

结果:

  • (2)编写一个xcopy_fle函数来实现,可以接受多个参数,将指定目录中的多个指定文件拷贝到另外的指定目录
import os
def x_copy_file(target,*src):
   for i in src:
        with open(i,'rb') as stream:
            data = stream.read()
            fname,fename=os.path.split(i)
            with open(target+fename,'wb') as writer:
                writer.write(data)

但我觉得还不够,每个文件都要写路径,太麻烦了,故再次优化如下

import os
def x_copy_file(srcfile,targetfile,*src):#同文件夹下批量文件的复制 srcfile为待复制文件所在文件夹 targetfile为目标所在文件夹 注意要加“/”
   for i in src:
        with open(srcfile+i,'rb') as stream:
            data = stream.read()
            fname,fename=os.path.split(i)
            with open(targetfile+fename,'wb') as writer:
                writer.write(data)

经过实验是成功的 

x_copy_file('E:/python_files/Ku/',"D:/dektop/","D2_find_num316.py","D2_zhitu_test2.py")

  • (3)copy_fle和xcopy_file函数形成一个独立的(pakage),尝试import,并测试其功能。

创建__init__.py

使得放了想调用的函数的 py06_411成package

代码实现:

import os
from py06_411.x_copy import x_copy_file#import 函数
from py06_411.copy import copy_file
os.chdir("E:\python_files\py06_411\save")

os.mkdir("N06_1")
for pth in os.listdir():
    if("-06" in pth):
        print(pth)#有点仪式感,顺便检查
copy_file(os.path.join(r"E:/python_files/py06_411/save",pth),os.path.join(r"E:/python_files/py06_411\save/N06_1",pth))#调用copy_file函数

os.mkdir("N06_2")
n=0
a=[]
for pth in os.listdir():
    if("-06" in pth):
        a.append(pth)
        print(pth)
x_copy_file('E:/python_files/py06_411/save/',"E:/python_files/py06_411/save/N06_2/",*tuple(a))#调用x_copy_file函数,注意 这里的*a是神来之笔!

这里要注意 不定长参数的调用 你定义的函数是不定长参数 本质上构成了一个元组 但是如果此处的“*a”,是“a”的话,不管你是用字符串,还是列表,还是元组都读不进去!

因为你其实要么多了 “ “” ”,要么多了“[]”,要么多了“()”,而你本身手敲的话是仅仅用“,”分割,而不是整体多了前面所说的这些,为了避免,可以所需告诉它这是一个不定长参数,即元组的情况下(因为本质是元组,但元组不好输入,所以我先用的列表),加个“*”,即可!

结果:

前者为copy_file结果,后者为x_copy_file结果,均成功复制了“-06”文件

(4)故原来的第一问亦可以如下实现

import os
from py06_411.x_copy import x_copy_file
os.chdir("E:/python_files/py06_411/save")
def auto_copy(mother,son,n):
    m='-'+n
    a=[]
    os.mkdir(n)#创建文件夹
    son=son+n+'/'
    for pth in os.listdir():
        if(m in pth):
            a.append(pth)
            print(pth)#有点仪式感顺便检查
    x_copy_file(mother,son,*tuple(a))#调用包里的函数
auto_copy('E:/python_files/py06_411/save/',"E:/python_files/py06_411/save/","06")
auto_copy('E:/python_files/py06_411/save/',"E:/python_files/py06_411/save/","07")
auto_copy('E:/python_files/py06_411/save/',"E:/python_files/py06_411/save/","08")
auto_copy('E:/python_files/py06_411/save/',"E:/python_files/py06_411/save/","09")
auto_copy('E:/python_files/py06_411/save/',"E:/python_files/py06_411/save/","16")

正常显示!撒花(。・∀・)ノ゙

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值