案例故事
百度網盤非會員大量上傳檔案,會彈出:“上傳檔案數量超出500個限制,開通超級會員后可繼續上傳”,
其實是限制拖入500張相片,并非限制上傳500張,

非會員如何將眾多檔案,分割成500一個的檔案夾,不受拖入數量限制呢?
準備階段
- os.walk()函式,可以樹形遍歷整個路徑下的檔案夾串列和檔案串列
- Path(路徑).parent屬性,可以獲取該“路徑”的父路徑
- os.path.relpath("D:\aaa\bbb\ccc",start="D:\aaa")函式,可以回傳“bbb\ccc”字串, 實作路徑裁剪,
- os.sep 可以代表任何路徑分隔符
- os.rename()函式,可以實作移動功能
- sys.argv[1] 通過接收“待分割的路徑”引數的輸入
Python面向物件類形式
# python3.8
# coding=utf-8
import os
import sys
from pathlib import Path
class BaiduPanCutter(object):
'''百度網盤500個檔案分割器'''
def __init__(self, root_path, count=500):
self.root_path = root_path
self.count = count
self.folder_file_dict = {} # 檔案夾與其檔案串列的映射字典
self.get_folders_files() # 獲取該根路徑下的所有檔案夾串列和檔案串列
def get_folders_files(self):
'''獲取該根路徑下的所有檔案夾串列和檔案串列'''
for folders, _, files in os.walk(self.root_path):
self.folder_file_dict[folders] = files
def _split(self, arr, count):
'''分割檔案串列,每500算一份'''
arrs = []
while len(arr) > count:
piece = arr[:count]
arrs.append(piece)
arr = arr[count:]
arrs.append(arr)
return arrs
# 分割檔案并放到新的檔案去
def cut_file(self):
'''分割并移動到新的檔案夾'''
for each_folder in self.folder_file_dict.keys():
num = 1 # 以500為倍數,這是1倍
# 將檔案路徑(摒棄當前路徑)轉成字串,用_隔開
temp_path = os.path.relpath(each_folder, Path(self.root_path).parent)
temp_path = temp_path.replace(os.sep, "_")
print(temp_path)
files_list = self.folder_file_dict[each_folder]
file_group = self._split(files_list, self.count) # 按500來分割
if len(file_group) > 1: # 有超過500個的檔案串列
for each_group in file_group: # 遍歷每500份的檔案串列
new_folder = os.path.join(self.root_path, temp_path + "_" + str(num)) # 新路徑
if not os.path.exists(new_folder):
os.mkdir(new_folder)
for each_file in each_group:
old_file = os.path.join(each_folder, each_file)
new_file = os.path.join(new_folder, each_file)
print("正在將%s 移動到 %s" % (old_file, new_file))
os.rename(old_file, new_file)
num = num + 1
else: # 無超過500個的檔案串列
new_folder = os.path.join(self.root_path, temp_path) # 新路徑
if not os.path.exists(new_folder):
os.mkdir(new_folder)
for each_file in file_group[0]: #
old_file = os.path.join(each_folder, each_file)
new_file = os.path.join(new_folder, each_file)
print("正在將%s 移動到 %s" % (old_file, new_file))
os.rename(old_file, new_file)
if __name__ == '__main__':
try:
arg1 = sys.argv[1]
if os.path.isdir(arg1):
b_obj = BaiduPanCutter(arg1, 500)
b_obj.cut_file()
else:
print("非檔案夾,運行方法:python %s 路徑檔案夾" % sys.argv[0])
except IndexError:
print("未輸入待分割的路徑檔案夾, 運行方法:python %s 路徑檔案夾" % sys.argv[0])
os.system("pause")
運行方式與效果
運行方式:將以上代碼命名為:baidu_pan_500_cutter.py
通過命令:python baidu_pan_500_cutter.py D:\DCIM\Photos 運行

每個檔案夾都不會超過500個檔案,后續將一個一個的檔案夾拖入百度網盤(電腦客戶端)即可了,
備注資訊
- 本腳本不涉及任何的洗掉檔案或檔案夾的操作,不會出現檔案丟失情況,
- 兼容非英文的檔案夾或檔案分割操作,
更多更好的原創文章,請訪問官方網站:www.zipython.com
自拍教程(自動化測驗Python教程,武散人編著)
原文鏈接:https://www.zipython.com/#/detail?id=c6156f71199346f4a10ea5ccbe6aa0b6
也可關注“武散人”微信訂閱號,隨時接受文章推送,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/245544.html
標籤:其他
上一篇:7 Ajax
