Python 提供了豐富的函式庫和工具,方便進行檔案處理和操作。本文將介紹如何使用 Python 實作大型檔案分割與子目錄複製工具,結合 Pandas 函式函式庫有效處理大型 CSV 和 TXT 檔案,並示範如何根據指定的行數或檔案數量,將大檔案分割成多個小檔案,以及如何將資料夾分割成多個子資料夾,有效提升檔案處理效率,避免記憶體不足或處理時間過長的問題。同時,也示範瞭如何使用 shutil 函式函式庫進行檔案複製,確保檔案完整性。

檔案分割工具

概述

檔案分割工具是一種實用的程式,旨在將大型的 CSV 或 TXT 檔案分割成多個小檔案,以便於更容易地處理和分析資料。這個工具提供了一個簡單的方法來分割檔案,根據指定的行數進行分割。

初始化

在使用檔案分割工具之前,需要初始化工具的屬性,包括檔名稱、目錄、分割行數等。

class FileSplitter:
    def __init__(self, filename, split_number):
        self.file_name = filename
        self.directory = "file_split"
        self.split = int(split_number)
        # ...

目錄處理

如果指定的目錄已經存在,則會刪除該目錄並重新建立。

if os.path.exists(self.directory):
    shutil.rmtree(self.directory)
os.mkdir(self.directory)

檔案分割

檔案分割工具使用 pandas函式庫來讀取 CSV 或 TXT 檔案,並根據指定的行數進行分割。

def split_data(self):
    data = pd.read_csv(self.file_name, header=None)
    data.index += 1
    split_frame = pd.DataFrame()
    output_file = f"{self.directory}/split_file{self.file_number}"
    # ...

分割邏輯

分割邏輯是檔案分割工具的核心部分,負責根據指定的行數進行分割。

for i in range(0, len(data), self.split):
    split_frame = data.iloc[i:i+self.split]
    split_frame.to_csv(output_file, index=False, header=False)
    self.file_number += 1
    output_file = f"{self.directory}/split_file{self.file_number}"

內容解密:

檔案分割工具的分割邏輯是使用 pandas 的 iloc 方法來選擇指定行數的資料,並使用 to_csv 方法來將分割的資料寫入到新的檔案中。檔名稱是根據分割的次數來命名的。

圖表翻譯:

以下是檔案分割工具的流程圖:

  flowchart TD
    A[初始化] --> B[目錄處理]
    B --> C[檔案分割]
    C --> D[分割邏輯]
    D --> E[輸出檔案]

圖表翻譯:

檔案分割工具的流程圖展示了工具的初始化、目錄處理、檔案分割、分割邏輯和輸出檔案的流程。這個圖表有助於理解工具的工作原理和流程。

大型檔案分割工具

概述

在處理大型檔案時,檔案分割是一種常見的技術,能夠將大檔案分割成多個小檔案,以方便儲存、傳輸和處理。以下是使用Python實作的一個大型檔案分割工具。

工具功能

此工具能夠將大型檔案分割成多個小檔案,每個小檔案的大小可以根據使用者的需求進行設定。工具支援多種檔案格式,包括txt、csv等。

程式碼實作

import pandas as pd
import sys

class Split_Files:
    def __init__(self, file, split_number):
        self.file = file
        self.split_number = int(split_number)
        self.directory = './'
        self.file_extension = '.' + file.split('.')[-1]
        self.file_number = 1
        self.split_frame = pd.DataFrame()

    def split_data(self):
        data = pd.read_csv(self.file, header=None)
        for i in range(1, len(data)+1):
            self.split_frame = self.split_frame._append(data.iloc[i-1], ignore_index=True)
            if i % self.split_number == 0:
                output_file = f"{self.directory}/split_file{self.file_number}{self.file_extension}"
                if self.file_extension == '.txt':
                    self.split_frame.to_csv(output_file, header=False, index=False, sep=' ')
                else:
                    self.split_frame.to_csv(output_file, header=False, index=False)
                self.split_frame.drop(self.split_frame.index, inplace=True)
                self.file_number += 1
        if not self.split_frame.empty:
            output_file = f"{self.directory}/split_file{self.file_number}{self.file_extension}"
            self.split_frame.to_csv(output_file, header=False, index=False)

if __name__ == '__main__':
    file, split_number = sys.argv[1], sys.argv[2]
    sp = Split_Files(file, split_number)
    sp.split_data()

內容解密:

  1. 類別定義:定義了一個名為Split_Files的類別,用於處理大型檔案分割。
  2. 初始化:在類別初始化時,設定檔案路徑、分割數量、檔案副檔名和輸出檔案名稱。
  3. 分割資料:使用pandas函式庫讀取大型檔案,然後根據分割數量將檔案分割成多個小檔案。
  4. 輸出檔案:將分割後的資料寫入到對應的輸出檔案中。

圖表翻譯:

  flowchart TD
    A[初始化] --> B[讀取檔案]
    B --> C[分割資料]
    C --> D[輸出檔案]
    D --> E[完成]

此工具可以根據使用者的需求進行分割,支援多種檔案格式,能夠有效地處理大型檔案。

將資料夾分割為子資料夾

執行

python <輸入資料夾名稱> <檔案數量> 原始程式碼:

import glob
import os
from shutil import copy2
import sys

def get_files(path):
    '''
    回傳給定資料夾中的檔案清單
    '''
    files = glob.glob(f'{path}/*')
    return files

def getfullpath(path):
    '''
    回傳給設定檔案的絕對路徑
    '''
    return os.path.abspath(path)

def copyfiles(src, dst):
    '''
    複製檔案從 src 到 dst
    如果 dst 目錄不存在,則會建立新目錄
    '''
    # ... (原始程式碼未提供完整的 copyfiles 函式實作)

內容解密:

上述程式碼提供了一個基本的框架,用於將資料夾分割為子資料夾。get_files 函式回傳給定資料夾中的檔案清單,getfullpath 函式回傳給設定檔案的絕對路徑。copyfiles 函式則複製檔案從源路徑到目的路徑,如果目的路徑不存在,則會建立新目錄。

然而,原始程式碼並未提供 copyfiles 函式的完整實作。為了完成資料夾分割的功能,我們需要補充 copyfiles 函式的實作,並新增相關的邏輯以便將檔案分割到子資料夾中。

以下是 copyfiles 函式的可能實作:

def copyfiles(src, dst):
    if not os.path.exists(dst):
        os.makedirs(dst)
    copy2(src, dst)

這個實作會檢查目的路徑是否存在,如果不存在,則會建立新目錄。然後,使用 copy2 函式複製檔案從源路徑到目的路徑。

圖表翻譯:

  flowchart TD
    A[開始] --> B[取得檔案清單]
    B --> C[複製檔案到子資料夾]
    C --> D[檢查目的路徑是否存在]
    D -->|存在| E[複製檔案]
    D -->|不存在| F[建立新目錄]
    F --> E

這個流程圖描述了資料夾分割的過程,從取得檔案清單開始,到複製檔案到子資料夾,包括檢查目的路徑是否存在和建立新目錄的步驟。

檔案分割與複製流程

在進行大規模的檔案操作時,能夠高效地分割和複製檔案是非常重要的。以下將介紹如何實作這一功能。

檔案複製

首先,需要確保目標目錄存在,如果不存在則建立它。接著,使用 copy2 函式將原始檔複製到目標目錄。

import os
import shutil

def copy_file(src, dst):
    if not os.path.isdir(dst):
        os.makedirs(dst)
    shutil.copy2(src, dst)

檔案分割

檔案分割是指將一個大檔案或檔案列表分割成多個小檔案或子列表,以便於後續的處理。以下是實作檔案分割的函式:

def split_data(data, count):
    """
    Split Given list of files and return generator
    """
    for i in range(0, len(data), count):
        yield data[i:i+count]

檔案處理流程

現在,讓我們將檔案分割和複製功能整合到一起,實作一個檔案處理流程。這個流程包括取得檔案列表、分割檔案列表和複製檔案。

import os
import shutil

def get_files(path):
    # 取得目錄下的所有檔案
    return [os.path.join(path, f) for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]

def start_process(path, count):
    files = get_files(path)
    splited_data = split_data(files, count)
    for i, chunk in enumerate(splited_data):
        dst = os.path.join(path, f"chunk_{i}")
        for file in chunk:
            copy_file(file, dst)

實際應用

在實際應用中,以上的流程可以用於大規模的檔案備份、檔案分發等場景。例如,當需要將一個大型的檔案集合備份到多個目錄時,可以使用以上的流程實作。

圖表翻譯:

  graph LR
    A[取得檔案列表] --> B[分割檔案列表]
    B --> C[複製檔案]
    C --> D[完成]

內容解密:

以上的流程涉及到檔案的複製和分割。首先,需要取得目標目錄下的所有檔案列表。接著,使用 split_data 函式將檔案列表分割成多個子列表。最後,使用 copy_file 函式將每個子列表中的檔案複製到對應的目錄。這個流程可以高效地處理大規模的檔案操作。

資料夾分割與檔案複製

概述

以下程式碼示範如何分割資料夾中的檔案並將其複製到新的資料夾中。這個過程可以根據指定的檔案數量進行分割。

程式碼

import os
import sys
import shutil

def split_and_copy(input_folder, count):
    # 取得資料夾中的檔案列表
    files = [f for f in os.listdir(input_folder) if os.path.isfile(os.path.join(input_folder, f))]
    
    # 計算每個資料夾中的檔案數量
    files_per_folder = len(files) // count
    
    # 初始化資料夾索引
    folder_idx = 0
    
    # 初始化檔案索引
    file_idx = 0
    
    # 遍歷檔案
    for file in files:
        # 檢查是否需要建立新資料夾
        if file_idx % files_per_folder == 0 and file_idx != 0:
            folder_idx += 1
        
        # 取得檔案路徑
        file_path = os.path.join(input_folder, file)
        
        # 取得新資料夾名稱
        new_folder_name = f'data_{folder_idx}'
        
        # 建立新資料夾如果不存在
        if not os.path.exists(new_folder_name):
            os.makedirs(new_folder_name)
        
        # 複製檔案到新資料夾
        shutil.copy(file_path, new_folder_name)
        
        # 更新檔案索引
        file_idx += 1

if __name__ == "__main__":
    # 驗證命令列引數
    if len(sys.argv) != 3:
        print("請提供正確的引數\npython split_and_copy.py <input_folder_path> <count>")
        sys.exit(0)
    
    # 取得命令列引數
    input_folder = sys.argv[1]
    count = int(sys.argv[2])
    
    # 驗證輸入資料夾
    if os.path.isdir(input_folder):
        # 呼叫分割與複製函式
        split_and_copy(input_folder, count)
    else:
        print("輸入資料夾不存在")

內容解密:

  1. 資料夾分割:程式碼首先會計算每個資料夾中應該包含的檔案數量,然後根據這個數量來分割檔案。
  2. 檔案複製:對於每個檔案,程式碼會將其複製到對應的新資料夾中。
  3. 命令列引數:程式碼接受兩個命令列引數:輸入資料夾路徑和分割數量。
  4. 輸入資料夾驗證:程式碼會驗證輸入資料夾是否存在,如果不存在則會顯示錯誤訊息。

圖表翻譯:

  flowchart TD
    A[開始] --> B[取得輸入資料夾路徑]
    B --> C[驗證輸入資料夾]
    C --> D[計算每個資料夾中的檔案數量]
    D --> E[遍歷檔案]
    E --> F[複製檔案到新資料夾]
    F --> G[完成]

此圖表描述了程式碼的流程,從取得輸入資料夾路徑開始,然後驗證輸入資料夾,計算每個資料夾中的檔案數量,遍歷檔案,複製檔案到新資料夾,最後完成。

資料比較與視覺化

導言

在資料分析中,比較不同資料集是常見的需求。這個過程可以幫助我們瞭解不同資料集之間的關係和差異。為了簡化這個過程,我們可以使用 Python 的 pandas 和 plotly 函式庫來實作資料比較和視覺化。

步驟

步驟 1:安裝必要的函式庫

首先,需要安裝 pandas 和 plotly。可以使用 pip 進行安裝:

pip install pandas plotly

步驟 2:匯入函式庫和輸入資料集

import pandas as pd
import plotly.express as px

# 輸入資料集路徑
data1_path = input("請輸入第一個資料集的路徑:")
data2_path = input("請輸入第二個資料集的路徑:")

# 讀取資料集
data1 = pd.read_excel(data1_path)
data2 = pd.read_excel(data2_path)

步驟 3:合併資料集

# 輸入合併的基礎
reference = input("請輸入合併的基礎:")

# 合併資料集
data_total = data2.merge(data1, on=reference)

步驟 4:選擇比較的欄位

# 輸入比較的欄位
criteria_1 = input("請輸入第一個比較的欄位:")
criteria_2 = input("請輸入第二個比較的欄位:")

步驟 5:建立餅圖

# 建立餅圖
fig = px.pie(data_total, values=criteria_1, names=criteria_2)

步驟 6:顯示餅圖

# 顯示餅圖
fig.show()

完整程式碼

import pandas as pd
import plotly.express as px

def compare_data():
    # 輸入資料集路徑
    data1_path = input("請輸入第一個資料集的路徑:")
    data2_path = input("請輸入第二個資料集的路徑:")

    # 讀取資料集
    data1 = pd.read_excel(data1_path)
    data2 = pd.read_excel(data2_path)

    # 輸入合併的基礎
    reference = input("請輸入合併的基礎:")

    # 合併資料集
    data_total = data2.merge(data1, on=reference)

    # 輸入比較的欄位
    criteria_1 = input("請輸入第一個比較的欄位:")
    criteria_2 = input("請輸入第二個比較的欄位:")

    # 建立餅圖
    fig = px.pie(data_total, values=criteria_1, names=criteria_2)

    # 顯示餅圖
    fig.show()

if __name__ == "__main__":
    compare_data()

使用Python從IMAP伺服器提取電子郵件並儲存到CSV檔案

介紹

本專案包含一個簡單的指令碼,從IMAP伺服器提取電子郵件並將其儲存到一個簡單的四欄CSV檔案中。

相依性

本專案相依於BeautifulSoup函式庫和lxml,用於從HTML郵件中提取文字。

執行指令碼

要執行指令碼,您需要有一個名為credentials.txt的檔案,包含您的IMAP伺服器帳戶名稱和密碼,分別放在不同的行中。Gmail和其他許多IMAP提供者需要您建立一個單獨的「應用密碼」,以允許此程式碼執行,因此您可能需要先建立一個。

然後,只需執行以下命令:

python store_emails.py

這將在當前目錄中生成一個名為mails.csv的檔案。生成的CSV檔案包含以下欄位:

  • 日期
  • 傳送者(From)
  • 主題(Subject)
  • 郵件文字(Message text)

需求

  • beautifulsoup4
  • lxml

程式碼

#!/usr/bin/env python

import csv
import email
from email import policy
import imaplib
import logging
import os
import ssl
from bs4 import BeautifulSoup

# ... (其他程式碼)

CSV檔案結構

生成的CSV檔案包含四欄:日期、傳送者、主題和郵件文字。每行代表一封郵件,欄位之間以逗號分隔。

使用IMAP伺服器

要使用IMAP伺服器,您需要有一個IMAP帳戶和密碼。您可以在credentials.txt檔案中儲存您的帳戶名稱和密碼。

Beautiful Soup和lxml

Beautiful Soup是一個Python函式庫,用於解析HTML和XML檔案。lxml是一個Python函式庫,用於解析XML檔案。這兩個函式庫都被用於從HTML郵件中提取文字。

內容解密:

上述程式碼使用Beautiful Soup和lxml來解析HTML郵件並提取郵件文字。郵件文字被儲存到CSV檔案中。

圖表翻譯:

以下是使用Mermaid語法繪製的郵件提取流程圖:

  flowchart TD
    A[開始] --> B[連線IMAP伺服器]
    B --> C[提取郵件]
    C --> D[解析HTML郵件]
    D --> E[提取郵件文字]
    E --> F[儲存到CSV檔案]
    F --> G[結束]

這個圖表顯示了郵件提取流程,從連線IMAP伺服器到儲存郵件文字到CSV檔案。

從技術架構視角來看,以上數個Python程式碼片段涵蓋了 diverse 的檔案處理與資料操作任務,包含檔案分割、複製、資料夾管理、資料比較與視覺化,以及郵件擷取。這些程式碼片段雖各自獨立,但都展現了 Python 在處理這類任務時的靈活性與效率。然而,程式碼片段的實作方式仍有改進空間。例如,檔案分割工具可以加入更多檔案格式支援及錯誤處理機制,大型檔案分割工具則可以考慮使用更有效率的迭代器或生成器,避免一次性載入整個檔案到記憶體,以提升處理巨量檔案的效能。資料夾分割與檔案複製的程式碼可以進一步模組化,並加入引數化組態,提升程式碼的重用性。

評估這些程式碼片段的商業價值,其核心在於提升資料處理效率,降低人工操作成本。透過自動化檔案分割、複製、整理等繁瑣操作,企業可以更有效地運用資料資源,進而提升商業決策速度與準確性。尤其在資料量爆炸性成長的時代,這些自動化工具的價值更是不言而喻。然而,程式碼的安全性與穩定性仍需進一步強化,例如加入輸入驗證、錯誤處理、日誌記錄等機制,才能確保在實際應用場景中的可靠性。

展望未來,隨著雲端儲存與大資料技術的發展,檔案處理與資料操作的需求將更加多元化和複雜化。預期未來會出現更多整合性更強、功能更豐富的工具,例如結合雲端儲存、分散式運算、機器學習等技術,實作更智慧化的檔案管理和資料分析。對於開發者而言,持續學習新的技術和工具,並將其應用於實務場景,將是保持競爭力的關鍵。玄貓認為,掌握這些核心技術,並持續精程式式碼品質與效能,將有助於開發者在資料驅動的時代中脫穎而出。