python pyzipper

import os
import shutil
import pandas as pd
from typing import Dict
import pyzipper

class DataSaver:
    def __init__(self, directory: str):
        """初始化DataSaver類(lèi)。

        Args:
            directory: 數(shù)據(jù)保存的目錄。
        """
        self.directory = directory
    
    def save_dataframes(self, dataframes: Dict[str, pd.DataFrame]):
        """將多份數(shù)據(jù)保存到指定目錄下,得到多份文件。

        Args:
            dataframes: 待保存的DataFrame字典,鍵為文件名,值為DataFrame數(shù)據(jù)。

        Returns:
            保存的文件列表。
        """
        if not os.path.exists(self.directory):
            os.makedirs(self.directory)
        self.dataframes = dataframes

        file_list = []
        for file_name, df in dataframes.items():
            file_path = os.path.join(self.directory, file_name)
            if file_path.endswith(".csv"):
                df.to_csv(file_path, index=False)
            elif file_path.endswith(".xlsx"):
                df.to_excel(file_path, index=False)
            else:
                raise ValueError("不支持的文件類(lèi)型")
            file_list.append(file_path)

        return file_list
    
    def zip_directory(self, zip_filename='data.zip', password=None):
        """
        將目錄中的所有文件壓縮為一個(gè)zip文件,可選擇是否進(jìn)行加密。

        Args:
            zip_filename (str): zip文件的文件名
            password (str or bytes): 加密密碼,默認(rèn)不加密
        """
        # 壓縮目錄下所有文件
        zip_path = os.path.join(self.directory, zip_filename)
        
        flist = []
        for root, dirs, files in os.walk(self.directory):
            for file in files:
                if file in self.dataframes.keys():
                    file_path = os.path.join(root, file)
                    flist.append((file_path, os.path.relpath(file_path, self.directory)))
            
        with pyzipper.AESZipFile(zip_path, 'w', 
                                 compression=pyzipper.ZIP_LZMA,
                                 encryption=pyzipper.WZ_AES if password else None) as zf:
            if password:
                if isinstance(password, str):
                    # 密碼需要轉(zhuǎn)bytes類(lèi)型
                    password = password.encode()
                zf.setpassword(password)
            
            for ob in flist:
                file_path = ob[0]
                rel_file_path = ob[1]
                zf.write(file_path, arcname=rel_file_path)

    def delete_files_except_zip(self):
        """刪除目錄下除了zip文件以外的本次被打包文件。"""
        for file_name in self.dataframes.keys():
            file_path = os.path.join(self.directory, file_name)
            os.remove(file_path)


# 初始化DataSaver
saver = DataSaver("D:/新建文件夾/data")

# 保存數(shù)據(jù)
df1 = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
df2 = pd.DataFrame({"A": [7, 8, 9], "B": [10, 11, 12]})
dataframes = {"file1.csv": df1}
file_list = saver.save_dataframes(dataframes)

# 打包文件
saver.zip_directory('train.zip', '123456')

# 刪除非zip文件
saver.delete_files_except_zip()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容