การแก้ปัญหาของ Regex Matching ในไฟล์ Zip

หากคุณมีไฟล์ข้อความจำนวนมากที่ถูกบีบอัดอยู่ใน zip archives คุณอาจพบกับความท้าทายทั่วไป: วิธีการค้นหารูปแบบข้อความเฉพาะ เช่น ชื่อรุ่น ในไฟล์เหล่านั้นโดยไม่ต้องแตกไฟล์ออกก่อน ซึ่งอาจทำให้รู้สึกเบื่อหน่ายโดยเฉพาะเมื่อจัดการกับไฟล์เป็นล้าน ๆ ไฟล์ใน zip archives หลายไฟล์ ในบล็อกโพสต์นี้ เราจะสำรวจวิธีการใช้ความสามารถของ Python ในการจัดการกับปัญหานี้โดยใช้โมดูล zipfile

ความท้าทายในมือ

คุณอาจพบว่าตัวเองอยู่ในสถานการณ์ที่:

  • คุณมีไฟล์ข้อความมากกว่าหนึ่งล้านไฟล์ที่ถูกบีบอัดอยู่ใน 40 ไฟล์ zip
  • คุณมีรายชื่อประมาณ 500 ชื่อรุ่นของโทรศัพท์และต้องการนับว่าชื่อรุ่นแต่ละรุ่นได้ถูกกล่าวถึงกี่ครั้งในไฟล์เหล่านี้

กุญแจสำคัญที่นี่คือ การทำ regex matching บนเนื้อหาของไฟล์เหล่านี้โดยไม่ต้องทำการแตกไฟล์ ซึ่งเป็นเรื่องที่ท้าทาย ขณะที่ไม่มีการแก้ปัญหาที่พร้อมใช้งานซึ่งตรงตามความต้องการนี้อย่างสมบูรณ์ โมดูลในตัวของ Python สามารถช่วยสร้างทางออกที่ง่ายและมีประสิทธิภาพได้

ทางออกด้วยโมดูล Zipfile ของ Python

แม้ว่าจะไม่มีโมดูลที่เสนอการค้นหา regex อัตโนมัติในไฟล์บีบอัด แต่เราสามารถใช้โมดูล zipfile ของ Python ได้อย่างง่ายดาย ซึ่งจะช่วยให้เราสามารถอ่านเนื้อหาของไฟล์ใน zip archive และใช้รูปแบบการค้นหา regex กับเนื้อหานั้นได้

ขั้นตอนการดำเนินการทีละขั้นตอน

  1. นำเข้าโมดูลที่ต้องการ เริ่มต้นด้วยการนำเข้าโมดูล zipfile โมดูลนี้ให้เครื่องมือในการอ่านและเขียนไฟล์ zip โดยตรง

    import zipfile
    
  2. เปิด Zip Archive ใช้เมธอด ZipFile เพื่อเปิดไฟล์ zip ของคุณ

    f = zipfile.ZipFile('myfile.zip')
    
  3. วนลูปผ่านไฟล์ใน Archive วนผ่านรายการไฟล์ใน zip archive คุณสามารถรับชื่อไฟล์ทั้งหมดได้โดยใช้เมธอด namelist()

    for subfile in f.namelist():
        print(subfile)
    
  4. อ่านและค้นหาเนื้อหาของแต่ละไฟล์ สำหรับแต่ละไฟล์ ให้อ่านเนื้อหาของมันและแยกเป็นบรรทัด คุณสามารถประมวลผลบรรทัดเหล่านี้เพื่อตรวจหาการจับคู่โดยใช้ regex

    data = f.read(subfile)
    for line in data.split('\n'):
        print(line)  # เปลี่ยนบรรทัดนี้ด้วยตรรกะ regex matching ของคุณ
    

ตัวอย่างโค้ดที่สมบูรณ์

นี่คือวิธีการรวมทุกอย่างเข้าด้วยกันในสคริปต์แบบเต็ม:

#!/usr/bin/python

import zipfile
import re  # นำเข้าโมดูล regex เพื่อทำการจับคู่รูปแบบ

# กำหนดฟังก์ชันเพื่อค้นหาชื่อรุ่นใน zip
def search_models_in_zip(zip_filename, models):
    f = zipfile.ZipFile(zip_filename)
    occurrences = {model: 0 for model in models}

    for subfile in f.namelist():
        data = f.read(subfile).decode('utf-8')
        for line in data.split('\n'):
            for model in models:
                if re.search(model, line):
                    occurrences[model] += 1
    return occurrences

# กำหนดรายชื่อรุ่นของคุณที่นี่
model_names = ['model1', 'model2', 'model3']  # เพิ่มชื่อรุ่นของคุณ
result = search_models_in_zip('myfile.zip', model_names)
print(result)

สรุป

โดยการทำตามวิธีนี้ คุณสามารถทำ regex matching บนไฟล์ข้อความที่อยู่ภายใน zip archives ได้อย่างมีประสิทธิภาพด้วยโมดูล zipfile ของ Python วิธีนี้ช่วยประหยัดทั้งเวลาและพื้นที่จัดเก็บ ทำให้คุณจัดการกับชุดข้อมูลขนาดใหญ่ได้อย่างมีประสิทธิภาพมากยิ่งขึ้น ใช้ประโยชน์จากพลังของ Python และให้มันทำให้การประมวลผลข้อความของคุณง่ายดายขึ้นในวันนี้!

ตอนนี้คุณพร้อมที่จะดำดิ่งลงไปในไฟล์ zip ของคุณและเริ่มดึงข้อมูลเชิงลึกจากข้อมูลภายในแล้ว