上一篇V2.2python 循环控制流:整理文件夹中的文件,方便大白整十几万张图片。
今有个简友私信问我,为什么代码在windows外的操作系统用不了?
对代码重试运一次,确定不是代码逻辑问题。那就去问下度娘与查下文档,才知问题是:
windows文件名用的反斜杠,Mac/Linux系统不兼容。
python解决这个问题,是通过使用python3的新标准库:【pathlib】来处理文件与其路径。
了解此问题的根源原来是:
由于上世纪 80 年代早期计算机历史上的一个小意外。「MS-DOS」的第一版使用了正斜杠字符来指定命令行选项。当微软在「MS-DOS 2.0」中加入了对文件夹的支持时,正斜杠字符已经被使用了,所以他们采用了反斜杠作为替代。35 年后,我们仍然被受困于这种不一致性。
【pathlib】标准库处理方法,也正体现python的特性:简单,快捷;只需要使用正斜杠将一个路径或文件名传给一个新的Path()对象,然后它将处理余下的斜杠处理操作。
使用时注意:
-
你应该在使用「pathlib」函数的情况下使用正斜杠。「Path()」函数将会把正斜杠转化为适应当前操作系统环境的正确斜杠。赞!
-
如果你想要在路径上进行添加,你可以直接在你的代码中使用「/」操作符。
现重写对文件夹的文件整理的代码:
# -*- conding = utf8 -*-
#athur : 大白python
#time : 20190728
#title : python整理文件夹中的文件 V2系统通用版
#简书 :大白python
import os
import shutil
from pathlib import Path
#1. 获取当文件夹路径
current_path = Path("D:\自媒体\无水印头像大全\新建文件夹\萌娃头像集合-微博配图/") #正斜杠的需整理的文件夹路径 20190727更改
print("开始处理文件夹中的图片:"+ str(current_path))
#2. 获取当文件夹中的所有文件与文件夹,存在列表中 file_or_folder[]
file_or_folder = os.listdir(current_path)
#print(file_or_folder)
#3. 判断file_or_folder列表中每一个元素,isfile则移入以图片前16位字符命名的文件夹中,isfolder则passabs
# 3.1 新建一存储文件夹后:整理后,务必确保“整理后”是空的
os.makedirs(current_path /"整理后")
set = []
for filename in file_or_folder:
pic_path = current_path/filename ##用局部变量存文件地址 20190728改
if pic_path.exists() and pic_path.suffix == ".jpg"or pic_path.suffix == ".gif" :
#3.2 isfabsile 拆出文件名,并取前16位
pic_name = filename.split(".")[0]
print("正在移动图片:"+ filename)
string16 = pic_name[:16]
#3.3 在“整理后”文件夹中新那子前16位字符命名的文件夹,并将16位字符存入到set中
if string16 in set:
#存在文件夹
#3.4 移动图片到相应的前16位字符命名的文件夹中
##move函数参数必须是字符串,需将WindowsC对象转换为str 20190728更改
shutil.move(str(current_path/filename),str(current_path/"整理后"/string16))
else:
#不存在文件夹创建文件夹
set.append(string16)
os.makedirs(current_path/"整理后"/string16)
#3.4 移动图片到相应的前16位字符命名的文件夹中
##move函数参数必须是字符串,需将WindowsC对象转换为str 20190728更改
shutil.move(str(current_path/filename),str(current_path/"整理后"/string16))
else:
print("不是\"JPG\"图片")
PS:注意shutil.move函数参数必须是字符串,需将WindowsC对象转换为str字符串
100分大神,80分大牛,60分大白,对我,够用,能用,就好
网友评论