本质是笔者的一次作业(非计算机专业),包含了不定长参数的函数调用等有意思的地方,或者说这也是笔者觉得这次最有意思的地方,在(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")
正常显示!撒花(。・∀・)ノ゙