手機使用python操作圖檔檔案
起因
前幾天去國圖拍了一本書,一本心理學方面的書,也許你問我為什麼不去買一本,或者去網上找pdf。 其實吧,關于心理學方面的書可以說在市面上一抓就是一堆,至于拍這本書兩個原因,一個是沒有什麼收藏價值不值得我去買,隻适合應急用,然後就是這本書的作者寫作特點和其他大衆的不太一樣,可以說是有特點或者偏門,于是我就在手機上拍了一堆的圖檔,後來整理成了pdf,但是昨天我看的時候原圖檔檔案還在快上千了吧,一個一個選擇删除真是删煩了,
也許你會說為什麼不導入到電腦上進行删除,沒辦法我就是想整點不一樣的,學了python就是喜歡整點騷操作。(手動滑稽)
是以下面就在手機上使用python進行一波騷操作。。。
準備工具
首先你得有個手機,233(和沒說一樣),咳咳 說正經的,既然我要在手機上運作python了,這裡我推薦pydroid3,因為代碼是基于python3.6寫的(f-string的使用)
為了友善大家下載下傳,我給大家提供了百度雲下載下傳的位址:
背景回複:pydroid即可。
安裝打開之後這個樣子

剩下的就是運作代碼了,這個後面我們再說.
思路
在做這件事之前我們得知道具體如何去做。
1.确定待處理圖檔檔案所在目錄
2.然後确定要删除哪些圖檔,這裡我們以圖檔建立日期為準進行篩選。
3.為了防止誤删,安全起見在該檔案夾裡建立一個trash目錄,首先把目标圖檔移動到該檔案夾,然後确認圖檔可以删除之後再進行删除。就像不要輕易使用rm一樣,你懂得。給自己留一個反悔的時間。
代碼實作
好了既然思路确定了我們就可以動手實作了。
1.确認檔案所在檔案夾,這裡使用pathlib子產品,pathlib是python3裡的一個标準庫,主要也是操作路徑,和os子產品操作路徑比要說差別的話,就是拼接路徑有時候比較友善,最好的就是兩個配合着使用。好了下面上代碼
import pathlib
dir_path = pathlib.Path(filename).resolve().parent
resolve方法是擷取檔案運作時的目錄,parent是擷取上一級目錄,也就是圖檔的所在檔案夾
2.建立trash目錄,移動之後的圖檔所在目錄。
思路分析中提到這個檔案夾得作用就是類似垃圾箱可以确認後再删除。
trash_dir = dir_path.joinpath("trash")
我們可以通過joinpath方法進行拼接路徑,os.path.join()需要填二個參數,這裡隻需要一個即可,這就是優勢。但是需要注意的是這個方法最終擷取的路徑是個對象不是字元串
在後面的使用中需要轉換成字元串形式的路徑.
3.接下來我們知道我們需要操作的檔案類型是圖檔,這裡我以jpg為例,當然如果你的圖檔是png你可以寫png,python3的标準庫提供了glob子產品,這子產品可以設定比對規則去擷取需要比對的圖檔清單。
import glob
image_path_list = glob.glob(to_str_path(dir_path.joinpath("*.jpg")))
之前說擷取的路徑是對象是以to_str_path是一個轉換成字元串路徑的方法。
*.jpg可以比對是以字尾為jpg的檔案生産結果清單。
4.檔案都擷取完了但是并不一定都是我們需要的,我們需要的指定日期内的檔案
import os
file_time = os.path.getctime(image_path)
通過getctime我們擷取了圖檔建立時間,進行進一步篩選。
5.檔案都準備好了,我們就需要移動到trash目錄,等待處理了。
通過os子產品的rename方法或者shutils的move方法可以對檔案進行移動,這裡我選擇os子產品
import os
os.rename("移動前完整檔案路徑", "移動後完整檔案路徑")
6.此時檔案就在trash目錄了。
然後确認完了就可以删了,如果沒問題就執行delete方法.
這裡提供兩種删除方式一種是删除所有檔案,一種是整個檔案夾都删除,兩種唯一的差別就是下次不用建立trash目錄了,沒多大差別.
if del_type == "dir":
shutil.rmtree(trash_path) # 遞歸删除一個目錄以及目錄内的所有内容
else:
if os.path.exists(trash_path):
file_list = os.listdir(trash_path)
if file_list:
remove_f = partial(remove, trash_path=trash_path)
start_thread(remove_f, file_list)
示範
首先确定需要整理的檔案在哪個目錄。
這裡用我之前的手機截圖目錄為例。這裡有個小問題就是,我怎麼知道我的截圖檔案在哪個目錄....
一般手機檢視圖檔的時候都有個詳細資訊這裡面一般有路徑。向下面這樣。
通過圖檔我們可以清楚的看到路徑在截圖檔案夾裡,至此我們就确定了檔案的目錄。
然後為了友善我們就在需要操作的目錄裡執行python腳本,打開前面我們安裝的pydroid3
然後按照我的操作
1.将代碼複制到下面的框裡
可以把newfile改個别的名字.
2.調用方法傳入參數
方法傳入日期參數格式例如20190101。
這裡以20171227為例運作代碼。
在運作之後沒有結果,後來看了一眼圖檔知道了,程式預設圖檔格式是jpg,我的截圖都是png,是以我需要指定filetype參數為png,同是date_str參數設定為20171012.
運作代碼:
之後會發現指定的檔案已經在trash目錄了,
3.之後就可以執行delete方法删除了.
結語
到此為止,教程就這結束了,本來打算寫成多線程版的提提速來着結果發現好像手機沒反應,是以最好還是使用循環操作檔案了,這裡隻是提供這麼一個思路,代碼沒什麼難度。關鍵是看用途,怎麼樣你學會了麼。
下面是完整代碼
# -*- coding: utf-8 -*-
# @Time : 2019-02-15 13:31
# @Author : cxa
# @File : moveimagetotrash.py
# @Software: PyCharm
import glob
import pathlib
import os
import datetime
import shutil
'''
1.指定檔案下的圖檔擷取建立日期
2.執行start方法,參數
将擷取的這些檔案移動到一個目前目下的建立檔案trash裡面
3.為了防止誤删,去trash目錄先确認下檔案是否需要确認删除。如果确認看第4步
4.确認無誤執行delete方法,具體參數解釋看方法内部
'''
def to_str_path(path):
if path:
new_path = os.fspath(path)
return new_path
def move_file(image_path, date_str, trash_dir):
file_time = os.path.getctime(image_path)
stamp_to_datetime = datetime.datetime.fromtimestamp(file_time)
file_date = datetime.datetime.strftime(stamp_to_datetime, "%Y%m%d")
if file_date == date_str:
jpg_dir_path, jpg_name = os.path.split(image_path)
if not os.path.exists(to_str_path(trash_dir)):
os.makedirs(to_str_path(trash_dir))
os.rename(image_path, to_str_path(trash_dir.joinpath(jpg_name))) # 移動檔案或重命名,這裡是移動檔案
print(f"{jpg_name}已經移動到目前目錄的trash目錄")
def start(filename: str = None, date_str: str = "20190215", filetype: str = "jpg"):
'''
:param filename: 指定檔案夾名,預設目前py檔案所在的檔案夾
:param date_str: 删除日期格式yyyymmdd
:param filetype: 需要删除的檔案類型預設jpg.
:return: None
'''
filename = filename or __file__
dir_path = pathlib.Path(filename).resolve().parent
trash_dir = dir_path.joinpath("trash")
image_path_list = glob.glob(to_str_path(dir_path.joinpath(f"*.{filetype}")))
for image_path in image_path_list:
move_file(image_path, date_str=date_str, trash_dir=trash_dir)
def remove(file, trash_path):
os.remove(os.path.join(trash_path, file))
print(f"成功删除檔案,{file}")
def delete(del_type: str = "", filename: str = None):
'''
:param del_type:删除trash檔案夾的檔案,還是删除整個trash檔案夾
:param filename: trash檔案路徑的檔案夾名
:return:
'''
filename = filename or __file__
dir_path = pathlib.Path(filename).resolve().parent
trash_path = to_str_path(dir_path.joinpath("trash"))
if del_type == "dir":
shutil.rmtree(trash_path) # 遞歸删除一個目錄以及目錄内的所有内容
else:
if os.path.exists(trash_path):
file_list = os.listdir(trash_path)
for file in file_list:
remove(file, trash_path=trash_path)
else:
print("找不到要删除的檔案夾!")
if __name__ == '__main__':
start(date_str="20190217")
#delete("dir")
以下為多線程版本手機使用還有問題
# -*- coding: utf-8 -*-
# @Time : 2019-02-15 13:31
# @Author : cxa
# @File : moveimagetotrash.py
# @Software: PyCharm
import glob
import pathlib
import os
import datetime
import shutil
from concurrent import futures
from functools import partial
'''
1.指定檔案下的圖檔擷取建立日期
2.執行start方法,參數
将擷取的這些檔案移動到一個目前目下的建立檔案trash裡面
3.為了防止誤删,去trash目錄先确認下檔案是否需要确認删除。如果确認看第4步
4.确認無誤執行delete方法,具體參數解釋看方法内部
'''
def start_thread(func, l: list):
with futures.ThreadPoolExecutor(max_workers=10) as executor:
executor.map(func, l)
def to_str_path(path):
if path:
new_path = os.fspath(path)
return new_path
def move_file(image_path, date_str, trash_dir):
file_time = os.path.getctime(image_path)
stamp_to_datetime = datetime.datetime.fromtimestamp(file_time)
file_date = datetime.datetime.strftime(stamp_to_datetime, "%Y%m%d")
if file_date == date_str:
jpg_dir_path, jpg_name = os.path.split(image_path)
if not os.path.exists(to_str_path(trash_dir)):
os.makedirs(to_str_path(trash_dir))
os.rename(image_path, to_str_path(trash_dir.joinpath(jpg_name))) # 移動檔案或重命名,這裡是移動檔案
print(f"{jpg_name}已經移動到目前目錄的trash目錄")
def start(filename: str = None, date_str: str = "20190215", filetype: str = "jpg"):
'''
:param filename: 指定檔案夾名,預設目前py檔案所在的檔案夾
:param date_str: 删除日期格式yyyymmdd
:param filetype: 需要删除的檔案類型預設jpg.
:return: None
'''
filename = filename or __file__
dir_path = pathlib.Path(filename).resolve().parent
trash_dir = dir_path.joinpath("trash")
image_path_list = glob.glob(to_str_path(dir_path.joinpath(f"*.{filetype}")))
print(image_path_list)
move_f = partial(move_file, date_str=date_str, trash_dir=trash_dir)
start_thread(move_f, image_path_list)
def remove(file, trash_path):
os.remove(os.path.join(trash_path, file))
print(f"成功删除檔案,{file}")
def delete(del_type: str = "", filename: str = None):
'''
:param del_type:删除trash檔案夾的檔案,還是删除整個trash檔案夾
:param filename: trash檔案路徑的檔案夾名
:return:
'''
filename = filename or __file__
dir_path = pathlib.Path(filename).resolve().parent
trash_path = to_str_path(dir_path.joinpath("trash"))
if del_type == "dir":
shutil.rmtree(trash_path) # 遞歸删除一個目錄以及目錄内的所有内容
else:
if os.path.exists(trash_path):
file_list = os.listdir(trash_path)
if file_list:
remove_f = partial(remove, trash_path=trash_path)
start_thread(remove_f, file_list)
else:
print("找不到要删除的檔案夾!")
if __name__ == '__main__':
start()
# delete("dir")
同步釋出:微信公衆号:python學習開發