91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用Python如何實現在后臺解壓或壓縮文件

發布時間:2020-11-11 14:08:21 來源:億速云 閱讀:248 作者:Leah 欄目:開發技術

利用Python如何實現在后臺解壓或壓縮文件?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1.需求描述

編寫一個 Python 程序,每次下載壓縮包形式的文件后,自動將內部文件解壓到當前文件夾后將壓縮包刪除,通過本案例可以學到的知識點:

  • os 模塊綜合應用
  • glob 模塊綜合應用
  • 利用 gzip zipfile rarfile tarfile 模塊解壓文件

2.步驟分析和前置知識

碼代碼之前需要將復雜問題解釋成多個明確的要求,即這個程序實現的邏輯為:

  1. 定時檢測某個文件夾(如 download 文件夾)是否存在壓縮文件
  2. 如果有新出現的壓縮文件則將其解壓到當前文件夾內的新文件夾中 刪除壓縮文件
  3. 提到壓縮文件就要分不同壓縮格式進行討論,主要有以下4種:
     

提到壓縮文件就要分不同壓縮格式進行討論,主要有以下4種:

.gz: 即 gzip,通常只能壓縮一個文件
.tar: 本質上不是壓縮工具而是打包工具,可以跟 .gz 配合形成 .tar.gz 的打包壓縮格式 .zip: 和 .tar.gz 很類似但可以打包壓縮多個文件
.rar: 打包壓縮文件,最初用于 DOS

因此,文件是否為壓縮文件的判斷邏輯可以如下:

  1. 建立一個含壓縮包后綴的列表 compressed_lst = ['gz', 'tar', 'zip', 'rar']
  2. 目標文件夾下的所有文件名運行 filename.split(.)[-1] 獲取后綴名
  3. 判斷后綴名是否在 compressed_lst 中,如果存在則運行后續的解壓代碼
  4. 如果是以 gz 結尾的文件,解壓后需要再次判斷是否是以 .tar 結尾,并進行相應處理
     

不同壓縮文件的解壓代碼各不相同,在后續代碼操作中具體展開。

3.代碼實現

首先是獲取 download 文件夾下所有文件的文件名

import glob
import os

path = r'C:\xxxx\download'
file_lst = glob.glob(path + '/*')
# 列表推導式
filename_lst = [os.path.basename(i) for i in file_lst]

print(filename_lst)

接下來根據文件的后綴名判斷是否需要壓縮,先看一下代碼框架

for i in filename_lst:
  if '.' in i:
    # 獲取后綴名
    suffix = i.split('.')[-1]
    # 逐個將后綴名和各格式的壓縮后綴匹配
    if suffix == 'gz':
      pass
      if ...: # 再次判斷新產生的文件名是否以 .tar 結尾
        pass
    if suffix == 'tar':
      pass
    if suffix == 'zip':
      pass
    if suffix == 'rar':
      pass

這里有2個注意點:

有些文件沒有后綴名,因此可能不存在 .,這時用 filename.split('.')[-1]會報錯,因此需要先判斷
以.gz 結尾的文件,解壓后需要再次判斷是否是以 .tar 結尾,然后我們就可以分別將四種壓縮文件的解壓代碼寫成函數,符合時候單獨調用即可
1、處理.gz 文件

import gzip

def ungz(filename):
  filename = filename[:-3] # gz文件的單文件解壓就是去掉 filename 后面的 .gz
  gz_file = gzip.GzipFile(filename)
  with open(filename, "w+") as file:
    file.write(gz_file.read())
    return filename # 這個gzip的函數需要返回值以進一步配合untar函數

前面反復提及的 gz 文件有可能跟 tar 文件配合,因此解壓 gz 文件后需要再判斷是否有必要解開 tar 文件
這里就可以先把 tar 文件的函數寫出來
2、處理.tar文件

import tarfile

def untar(filename):
  tar = tarfile.open(filename)
  names = tar.getnames()
  # tar本身是將文件打包,解除打包會產生很多文件,因此需要建立文件夾存放
  if not os.path.isdir(filename + "_dir"):
    os.mkdir(filename + "_dir")
  for name in names:
    tar.extract(name, filename + "_dir/")
  tar.close()

3、處理.zip文件

import zipfile

def unzip(filename):
  zip_file = zipfile.ZipFile(filename)
  # 類似tar解除打包,建立文件夾存放解壓的多個文件
  if not os.path.isdir(filename + "_dir"):
    os.mkdir(filename + "_dir")
  for names in zip_file.namelist():
    zip_file.extract(names, filename + "_dir/")
  zip_file.close()

4、處理.rar文件

import rarfile

def unrar(filename):
  rar = rarfile.RarFile(filename)
  if not os.path.isdir(filename + "_dir"):
    os.mkdir(filename + "_dir")
  os.chdir(filename + "_dir")
  rar.extractall()
  rar.close()

可以看到,四種解壓代碼略有不同,推薦大家實際演示中自己體會一下差別,解壓后配合 os.remove() 就可以刪除壓縮包,現在看看邏輯框架補上解壓函數后的內容:

for filename in filename_lst:
  if '.' in filename:
    suffix = filename.split('.')[-1]
    if suffix == 'gz':
      new_filename = ungz(filename)
      os.remove(filename)
      if new_filename.split('.')[-1] == 'tar':
        untar(new_filename)
        os.remove(new_filename) 
    if suffix == 'tar':
      untar(filename)
      os.remove(filename)
    if suffix == 'zip':
      unzip(filename)
      os.remove(filename)
    if suffix == 'rar':
      unrar(filename)
      os.remove(filename)

5、實現實時檢測

比較簡單的方法就是建立 while True 死循環配合 time.sleep()睡眠,框架如下:

import time

while True:
  func()
  time.sleep(5) # 睡眠秒數可以設置大一點避免過度占用資源

最后將第二步的實現代碼改為函數并放在循環框架中就可以完成本次需求,完整代碼如下

import glob
import os
import gzip
import tarfile
import zipfile
import rarfile
import time

path = r'C:\xxxx\download'
file_lst = glob.glob(path + '/*')
filename_lst = [os.path.basename(i) for i in file_lst]

def ungz(filename):
  filename = filename[:-3]
  gz_file = gzip.GzipFile(filename)
  with open(filename, "w+") as file:
    file.write(gz_file.read())
  return filename

def untar(filename):
  tar = tarfile.open(filename)
  names = tar.getnames()
  if not os.path.isdir(filename + "_dir"):
    os.mkdir(filename + "_dir")
  for name in names:
    tar.extract(name, filename + "_dir/")
  tar.close()

def unzip(filename):
  zip_file = zipfile.ZipFile(filename)
  if not os.path.isdir(filename + "_dir"):
    os.mkdir(filename + "_dir")
  for names in zip_file.namelist():
    zip_file.extract(names, filename + "_dir/")
  zip_file.close()

def unrar(filename):
  rar = rarfile.RarFile(filename)
  if not os.path.isdir(filename + "_dir"):
    os.mkdir(filename + "_dir")
  os.chdir(filename + "_dir")
  rar.extractall()
  rar.close()

def unzip_files():
  for filename in filename_lst:
    if '.' in filename:
      suffix = filename.split('.')[-1]
      if suffix == 'gz':
        new_filename = ungz(filename)
        os.remove(filename)
        if new_filename.split('.')[-1] == 'tar':
          untar(new_filename)
          os.remove(new_filename)
      if suffix == 'tar':
        untar(filename)
        os.remove(filename)
      if suffix == 'zip':
        unzip(filename)
        os.remove(filename)
      if suffix == 'rar':
        unrar(filename)
        os.remove(filename)

while True:
  unzip_files()
  time.sleep(5)

看完上述內容,你們掌握利用Python如何實現在后臺解壓或壓縮文件的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兖州市| 北安市| 腾冲县| 綦江县| 玉田县| 铁岭县| 揭东县| 康马县| 凉城县| 黑山县| 怀宁县| 鱼台县| 泸溪县| 连江县| 丰台区| 宕昌县| 盐亭县| 三原县| 长沙县| 德化县| 凤翔县| 平江县| 嘉定区| 内乡县| 武宣县| 遵化市| 突泉县| 嫩江县| 盖州市| 锡林浩特市| 肥西县| 东阿县| 乐安县| 钟祥市| 定陶县| 中山市| 含山县| 吉木萨尔县| 吕梁市| 昌江| 射洪县|