Python解析壓縮包內(nèi)部文件的后綴名并分類(lèi)存放
1、背景
我們有很多壓縮包文件,假設(shè)壓縮包的種類(lèi)只有【.7z】,【.rar】,【.zip】,壓縮包里面有一個(gè)文件,文件可以是不同的格式(后綴),我們希望通過(guò)壓縮包內(nèi)的文件后綴,自動(dòng)創(chuàng)建文件夾,讓后將壓縮包進(jìn)行批量移動(dòng)
如下圖:每一個(gè)壓縮包內(nèi)都有一個(gè)文件(不同類(lèi)型\也可以相同類(lèi)型)

預(yù)期結(jié)果,如下圖

2、庫(kù)的安裝
| 庫(kù) | 用途 | 安裝 |
|---|---|---|
| py7zr | 壓縮包.7z操作 | pip install py7zr -i https://pypi.tuna.tsinghua.edu.cn/simple/ |
| rarfile | 壓縮包.rar操作 | pip install rarfile -i https://pypi.tuna.tsinghua.edu.cn/simple/ |
| zipfile | 壓縮包.rar操作 | 內(nèi)置庫(kù)無(wú)需安裝 |
| os | 獲取絕對(duì)路徑 | 內(nèi)置庫(kù)無(wú)需安裝 |
3、核心代碼
if zipfile.is_zipfile(archive_path):
with zipfile.ZipFile(archive_path, 'r') as zip_ref:
for file_info in zip_ref.infolist():
ext = os.path.splitext(file_info.filename)[1].lower()
if ext:
extensions.add(ext[1:]) # 去掉點(diǎn)號(hào)
elif rarfile.is_rarfile(archive_path):
with rarfile.RarFile(archive_path) as rar_ref:
for file_info in rar_ref.infolist():
ext = os.path.splitext(file_info.filename)[1].lower()
if ext:
extensions.add(ext[1:])
elif py7zr.is_7zfile(archive_path):
with py7zr.SevenZipFile(archive_path, mode='r') as z7_ref:
for filename in z7_ref.getnames():
ext = os.path.splitext(filename)[1].lower()
if ext:
extensions.add(ext[1:])
4、完整代碼
# -*- coding: UTF-8 -*-
'''
@Project :測(cè)試
@File :main.py
@IDE :PyCharm
@Author :一晌小貪歡(278865463@qq.com)
@Date :2024/12/23 15:32
'''
import os
import zipfile
import py7zr
import rarfile
import shutil
# 設(shè)置源文件夾和目標(biāo)文件夾
source_folder = '壓縮包數(shù)據(jù)源'
target_folder = '分類(lèi)文件夾'
# 檢查目標(biāo)文件夾是否存在,不存在則創(chuàng)建
if not os.path.exists(target_folder):
os.makedirs(target_folder)
def create_folder(folder_name):
folder_path = os.path.join(target_folder, folder_name)
if not os.path.exists(folder_path):
os.makedirs(folder_path)
return folder_path
def get_archive_extensions(archive_path):
extensions = set()
try:
if zipfile.is_zipfile(archive_path):
with zipfile.ZipFile(archive_path, 'r') as zip_ref:
for file_info in zip_ref.infolist():
ext = os.path.splitext(file_info.filename)[1].lower()
if ext:
extensions.add(ext[1:]) # 去掉點(diǎn)號(hào)
elif rarfile.is_rarfile(archive_path):
with rarfile.RarFile(archive_path) as rar_ref:
for file_info in rar_ref.infolist():
ext = os.path.splitext(file_info.filename)[1].lower()
if ext:
extensions.add(ext[1:])
elif py7zr.is_7zfile(archive_path):
with py7zr.SevenZipFile(archive_path, mode='r') as z7_ref:
for filename in z7_ref.getnames():
ext = os.path.splitext(filename)[1].lower()
if ext:
extensions.add(ext[1:])
except Exception as e:
print(f"讀取文件 {archive_path} 時(shí)出錯(cuò): {str(e)}")
return set()
return extensions
# 主程序
for filename in os.listdir(source_folder):
file_path = os.path.join(source_folder, filename)
if os.path.isfile(file_path):
# 獲取壓縮包內(nèi)所有文件的擴(kuò)展名
extensions = get_archive_extensions(file_path)
if extensions:
# 如果只有一種文件類(lèi)型,移動(dòng)到對(duì)應(yīng)文件夾
if len(extensions) == 1:
ext = extensions.pop()
dest_folder = create_folder(ext)
dest_path = os.path.join(dest_folder, filename)
shutil.move(file_path, dest_path)
print(f"移動(dòng) {filename} 到 {ext} 文件夾")
else:
# 如果有多種文件類(lèi)型,移動(dòng)到 mixed 文件夾
dest_folder = create_folder('mixed')
dest_path = os.path.join(dest_folder, filename)
shutil.move(file_path, dest_path)
print(f"移動(dòng) {filename} 到 mixed 文件夾 (包含文件類(lèi)型: {', '.join(extensions)})")
else:
print(f"跳過(guò)文件: {filename} (無(wú)法讀取或沒(méi)有有效文件)")
到此這篇關(guān)于Python解析壓縮包內(nèi)部文件的后綴名并分類(lèi)存放的文章就介紹到這了,更多相關(guān)Python解析文件后綴名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- python獲取文件路徑、文件名、后綴名的實(shí)例
- python獲取文件后綴名及批量更新目錄下文件后綴名的方法
- Python實(shí)現(xiàn)的批量修改文件后綴名操作示例
- python3 遍歷刪除特定后綴名文件的方法
- python文件操作之批量修改文件后綴名的方法
- 詳解Python相關(guān)文件常見(jiàn)的后綴名
- python 拷貝特定后綴名文件,并保留原始目錄結(jié)構(gòu)的實(shí)例
- Python實(shí)現(xiàn)將多個(gè)文件的名稱(chēng)或后綴名由大寫(xiě)改為小寫(xiě)
- Python實(shí)用技巧之如何獲取后綴名(擴(kuò)展名)或文件名
相關(guān)文章
python try except返回異常的信息字符串代碼實(shí)例
這篇文章主要介紹了python try except返回異常的信息字符串代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
用Python編寫(xiě)一個(gè)鼠標(biāo)自動(dòng)點(diǎn)擊程序詳細(xì)過(guò)程
這篇文章主要給大家介紹了關(guān)于如何使用Python編寫(xiě)一個(gè)鼠標(biāo)自動(dòng)點(diǎn)擊程序,通過(guò)使用pyautogui庫(kù),可以實(shí)現(xiàn)模擬鼠標(biāo)點(diǎn)擊的功能,文章還介紹了如何使用time庫(kù)和threading庫(kù)來(lái)控制點(diǎn)擊間隔時(shí)間和實(shí)現(xiàn)多線程,需要的朋友可以參考下2024-11-11
Python3實(shí)現(xiàn)并發(fā)檢驗(yàn)代理池地址的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)并發(fā)檢驗(yàn)代理池地址的方法,實(shí)例分析了Python3基于線程的代理檢驗(yàn)操作相關(guān)技巧,需要的朋友可以參考下2016-09-09
Python繪圖Turtle庫(kù)的安裝問(wèn)題解決
這篇文章主要介紹了Python繪圖中解決Turtle的安裝問(wèn)題示例分析,也遇到過(guò)相同問(wèn)題的同學(xué)可以借鑒參考下,希望能夠解決你的問(wèn)題2021-10-10
python中g(shù)eopandas庫(kù)安裝出現(xiàn)各種問(wèn)題的解決辦法
這篇文章主要介紹了關(guān)于python中g(shù)eopandas庫(kù)安裝出現(xiàn)各種問(wèn)題的解決辦法,總結(jié)了在Windows下兩種安裝geopandas庫(kù)的方法,方法一是在新環(huán)境下使用conda命令安裝,方法二通過(guò)離線安裝GDAL、Fiona、Pyproj、Rtree、Shapely五個(gè)庫(kù),再用pip安裝geopandas,需要的朋友可以參考下2024-11-11
Python實(shí)現(xiàn)提取Excel指定關(guān)鍵詞的行數(shù)據(jù)
這篇文章主要為大家介紹了如何利用Python實(shí)現(xiàn)提取Excel指定關(guān)鍵詞的行數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-03-03
Python?Asyncio中Coroutines,Tasks,Future可等待對(duì)象的關(guān)系及作用
這篇文章主要介紹了Python?Asyncio中Coroutines,Tasks,Future可等待對(duì)象的關(guān)系及作用,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下2022-06-06
python爬蟲(chóng)豆瓣網(wǎng)的模擬登錄實(shí)現(xiàn)
這篇文章主要介紹了python爬蟲(chóng)豆瓣網(wǎng)的模擬登錄實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

