python程序随笔:191016

实现文件的自动分类

程序的实现

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
32
33
34
35
36
import os  
import shutil

path = 'C:\\Users\\19143\\Desktop\\test\\'
files = os.listdir(path)
print(files)
folder_list = []

for f in files:
# 连接目录与文件名得到绝对路径,这里的path需要使用绝对路径,不然程序会自动到python程序路径下寻找
# 所以也可以把文件放在python程序路径下
f_absolute_path = path + f
# 如果是文件夹就单独处理,把它的路径记录下来
if not os.path.isfile(f_absolute_path):
folder_list.append(f_absolute_path)
continue
# folder_name即是一个以f文件后缀名来命名的文件夹的绝对路径
folder_name = path + f.split('.')[-1]
# print(folder_name)
if not os.path.exists(folder_name):
# 该文件夹不存在,就创建
os.makedirs(folder_name)
shutil.move(f_absolute_path, folder_name)
else:
shutil.move(f_absolute_path, folder_name)

print(folder_list)
if len(folder_list) > 1:
# 在path目录下创建一个名称为'all_folder'的文件夹
new_folder_path = path + 'all_folder'
os.mkdir(new_folder_path)
print(new_folder_path)
for folder in folder_list:
print(folder)
# 将path路径下的文件夹放入,all_folder下,(不包括以后缀名分类创建的文件夹)
shutil.move(folder, new_folder_path)

遇到的问题

  • os.path.isfile()用来判断是文件还是文件夹,os.path.isdir()用来判断是不是目录
  • os.path.abspath()用来获取文件或目录的绝对路径,目录的绝对路径包含它本身这一级
  • os.mkdir()只能创建一级目录,os.makedirs()可以递归创建目录
  • os.rmdir()为删除目录,它只能删空目录,shutil.rmtree()可以递归删除非空目录,另外os.remove()用来删除文件,若路径指定文件不存在会报错

取出一个文件夹内所有文件(包括子文件夹)

程序实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import os  
import shutil

path = 'C:\\Users\\19143\\Desktop\\steamcommunity_302_V8_hotfix\\'
# error
# new_path = 'C:\\Users\\19143\\Desktop\\steamcommunity_302_V8_hotfix\\all_files\\'

new_path = 'C:\\Users\\19143\\Desktop\\all_files'

if not os.path.exists(new_path):
os.mkdir(new_path)

for roots, dirs, files in os.walk(path):
#(逃) if not roots.endswith('\\'):
#(逃) roots += '\\'
for f in files:
print(roots,'\t',f,'\t',dirs)
# shutil.move(f, new_path)
shutil.copy(os.path.join(roots, f), new_path)

遇到的问题

  • 本来我是想dfs搜索所有文件夹的,然而我发现了os.walk()这个方便的函数,嗯,真香os.walk(top[,topdown=True[,onerror=None[,followlinks=False]]])是一个简单易用的文件、目录遍历器,帮助我们高效处理文件目录方面的事情,top为所要遍历的目录的地址,topdown为真优先遍历top目录,否则优先遍历子目录,followlinks为真,会遍历快捷方式实际所指目录;它的返回值是一个生成器,所以我们需要不断的遍历它,来获得我们需要的信息,每次遍历的对象都是返回的是一个三元组(root,dirs,files)

    1. root指的是当前正在遍历的这个文件夹的本身的绝对路径
    2. dirs是一个list,内容是当前遍历文件夹里的所有的文件夹的名称(不包含子目录)
    3. files也是list,内容是当前遍历文件夹里的所有文件的名称(不含子目录,且包含后缀名)
  • 注意os.path.join(path,file)的使用,之前我没用这个,我写的我给注释了,真的丑

    • shutil.move()与shutil.copy()函数,使用需要注意这个问题,它们分辨两个文件的方法是看它们的路径,即同一个文件分别放到两个不同路径下得到两个文件,这两个函数把这两个文件看成不同文件;另外,如果你把test文件夹下的文件test,使用shutil.move()移动或使用shutil.copy()复制到test文件夹下,即把某目录下的文件移动或复制到该目录下,这两种操作对于这两个函数都是不行的,会报错,如下面那张图片所示;
  • 关于你想要把文件保存到哪个文件夹,在这里即是new_path,这个new_path不能是path的子目录;有这样一种情况,假如path下直接有一个文件test,也有你的new_path,你遍历path下的文件,把test包括其他所有文件(不包括子目录)放入new_path中,然后os.walk()便开始遍历path子目录,比如new_path,(实际上,new_path你是不希望被访问的,它是专门用来存放文件的)。然后你遍历new_path中的文件,比如test,你就又访问了一次这个文件,然后复制test放入new_path中;然后它就会报错,比如: