การแก้ปัญหาของ Regex Matching ในไฟล์ Zip
หากคุณมีไฟล์ข้อความจำนวนมากที่ถูกบีบอัดอยู่ใน zip archives คุณอาจพบกับความท้าทายทั่วไป: วิธีการค้นหารูปแบบข้อความเฉพาะ เช่น ชื่อรุ่น ในไฟล์เหล่านั้นโดยไม่ต้องแตกไฟล์ออกก่อน ซึ่งอาจทำให้รู้สึกเบื่อหน่ายโดยเฉพาะเมื่อจัดการกับไฟล์เป็นล้าน ๆ ไฟล์ใน zip archives หลายไฟล์ ในบล็อกโพสต์นี้ เราจะสำรวจวิธีการใช้ความสามารถของ Python ในการจัดการกับปัญหานี้โดยใช้โมดูล zipfile
ความท้าทายในมือ
คุณอาจพบว่าตัวเองอยู่ในสถานการณ์ที่:
- คุณมีไฟล์ข้อความมากกว่าหนึ่งล้านไฟล์ที่ถูกบีบอัดอยู่ใน 40 ไฟล์ zip
- คุณมีรายชื่อประมาณ 500 ชื่อรุ่นของโทรศัพท์และต้องการนับว่าชื่อรุ่นแต่ละรุ่นได้ถูกกล่าวถึงกี่ครั้งในไฟล์เหล่านี้
กุญแจสำคัญที่นี่คือ การทำ regex matching บนเนื้อหาของไฟล์เหล่านี้โดยไม่ต้องทำการแตกไฟล์ ซึ่งเป็นเรื่องที่ท้าทาย ขณะที่ไม่มีการแก้ปัญหาที่พร้อมใช้งานซึ่งตรงตามความต้องการนี้อย่างสมบูรณ์ โมดูลในตัวของ Python สามารถช่วยสร้างทางออกที่ง่ายและมีประสิทธิภาพได้
ทางออกด้วยโมดูล Zipfile ของ Python
แม้ว่าจะไม่มีโมดูลที่เสนอการค้นหา regex อัตโนมัติในไฟล์บีบอัด แต่เราสามารถใช้โมดูล zipfile
ของ Python ได้อย่างง่ายดาย ซึ่งจะช่วยให้เราสามารถอ่านเนื้อหาของไฟล์ใน zip archive และใช้รูปแบบการค้นหา regex กับเนื้อหานั้นได้
ขั้นตอนการดำเนินการทีละขั้นตอน
-
นำเข้าโมดูลที่ต้องการ เริ่มต้นด้วยการนำเข้าโมดูล
zipfile
โมดูลนี้ให้เครื่องมือในการอ่านและเขียนไฟล์ zip โดยตรงimport zipfile
-
เปิด Zip Archive ใช้เมธอด
ZipFile
เพื่อเปิดไฟล์ zip ของคุณf = zipfile.ZipFile('myfile.zip')
-
วนลูปผ่านไฟล์ใน Archive วนผ่านรายการไฟล์ใน zip archive คุณสามารถรับชื่อไฟล์ทั้งหมดได้โดยใช้เมธอด
namelist()
for subfile in f.namelist(): print(subfile)
-
อ่านและค้นหาเนื้อหาของแต่ละไฟล์ สำหรับแต่ละไฟล์ ให้อ่านเนื้อหาของมันและแยกเป็นบรรทัด คุณสามารถประมวลผลบรรทัดเหล่านี้เพื่อตรวจหาการจับคู่โดยใช้ 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 ของคุณและเริ่มดึงข้อมูลเชิงลึกจากข้อมูลภายในแล้ว