ปัญหา
คุณต้องการสร้างไฟล์บีบอัดใน python
แนะนำตัว
ไฟล์ ZIP สามารถเก็บเนื้อหาที่บีบอัดของไฟล์อื่นๆ ได้มากมาย การบีบอัดไฟล์จะลดขนาดไฟล์บนดิสก์ ซึ่งมีประโยชน์เมื่อถ่ายโอนไฟล์ผ่านอินเทอร์เน็ตหรือระหว่างระบบโดยใช้ Control-m AFT หรือ Connect direct หรือแม้แต่ scp
โปรแกรม Python สร้างไฟล์ ZIP โดยใช้ฟังก์ชันในโมดูล zipfile
ทำอย่างไร...
1. เราจะใช้แพ็คเกจ zipfile และ io ติดตั้งด้วย pip หากมีแพ็คเกจใดหายไปในระบบของคุณ หากคุณไม่แน่ใจ ให้ใช้คำสั่ง pip freeze เพื่อตรวจสอบแพ็คเกจ
2. เราจะเขียนฟังก์ชันเพื่อเขียนข้อมูลตัวอย่างลงในไฟล์ ฟังก์ชัน write_data_to_files ด้านล่างใช้ข้อมูลเป็นอินพุตและสร้างไฟล์ในชื่อไดเร็กทอรีปัจจุบัน
ตัวอย่าง
# Function :write_data_to_filesdef write_data_to_files(inp_data, file_name):"""function :สร้างไฟล์ csv ด้วยข้อมูลที่ส่งผ่านไปยัง codeargs นี้ :inp_data :data ที่จะเขียนไปยังไฟล์เป้าหมาย filefile_name :target file name เพื่อเก็บข้อมูล datareturn :ไม่มีสมมติฐาน:ไฟล์ที่จะสร้างและรหัสนี้อยู่ในไดเร็กทอรีเดียวกัน"""print(f" *** กำลังเขียนข้อมูลไปที่ - {file_name}")throwaway_storage =io.StringIO(inp_data)with open(file_name, 'w' ) เป็น f:for บรรทัดใน throwaway_storage:f.write(line)
3. ตอนนี้เราจะเขียนฟังก์ชั่น file_compress เพื่อ zip ไฟล์ที่สร้างขึ้นในขั้นตอนข้างต้น ฟังก์ชันนี้ยอมรับรายการไฟล์ ผ่านไฟล์เหล่านั้น และบีบอัดเป็นไฟล์ zip คำอธิบายโดยละเอียดของแต่ละขั้นตอนมีอยู่ในความคิดเห็น
ในการสร้างไฟล์ ZIP ที่บีบอัดของคุณเอง คุณต้องเปิดออบเจ็กต์ ZipFile ในโหมดเขียนโดยส่ง 'w' เป็นอาร์กิวเมนต์ที่สอง
เมื่อคุณส่งพาธไปยังเมธอด write() ของออบเจกต์ ZipFile Python จะบีบอัดไฟล์ที่พาธนั้นและเพิ่มลงในไฟล์ ZIP
อาร์กิวเมนต์แรกสำหรับเมธอด write() คือสตริงของชื่อไฟล์ที่จะเพิ่ม
อาร์กิวเมนต์ที่สองคือพารามิเตอร์ประเภทการบีบอัด ซึ่งจะบอกคอมพิวเตอร์ว่าควรใช้อัลกอริธึมใดในการบีบอัดไฟล์
ตัวอย่าง
# Function :file_compressdef file_compress(inp_file_names, out_zip_file):"""function :file_compressargs :inp_file_names :list of filenames to be zippedout_zip_file :output zip filereturn :noneassumption :Input file paths and this code is in same directory."" # เลือกโหมดการบีบอัด ZIP_DEFLATED สำหรับการบีบอัด# หรือ zipfile.ZIP_STORED เพื่อจัดเก็บไฟล์บีบอัด =zipfile.ZIP_DEFLATEDprint(f" *** ป้อนชื่อไฟล์ที่ส่งสำหรับการซิป - {inp_file_names}")# สร้างไฟล์ zip ก่อน เส้นทาง/ชื่อพารามิเตอร์ , โหมดที่สองพิมพ์ (f' *** out_zip_file คือ - {out_zip_file}')zf =zipfile.ZipFile(out_zip_file, mode="w")try:for file_to_write ใน inp_file_names:# เพิ่มไฟล์ลงในไฟล์ zip# ไฟล์พารามิเตอร์ตัวแรกไปที่ zip ชื่อไฟล์ที่สองใน zipprint(f' *** กำลังประมวลผลไฟล์ {file_to_write}')zf.write (file_to_write, file_to_write, compress_type=compression) ยกเว้น FileNotFoundError เป็น e:print(f' *** มีข้อยกเว้นเกิดขึ้นระหว่างกระบวนการ zip - { e}') สุดท้าย:# อย่าลืมปิดไฟล์!zf.close()4. เราจะเรียกฟังก์ชันต่างๆ เพื่อสร้างไฟล์ csv สองไฟล์ แล้วทำการซิปไฟล์ เราจะใช้ข้อมูลนักเทนนิสที่ชนะรายการแกรนด์สแลมมากกว่า 1 รายการในไฟล์เดียว - temporary_file1_for_zip.csv และผู้เล่นเทนนิสที่ชนะรางวัลแกรนด์สแลมน้อยกว่าหรือเท่ากับ 1 รายการในไฟล์อื่น temporary_file1_for_zip.csv จากนั้นเราจะซิปไฟล์ทั้งสองนี้เป็นไฟล์ชั่วคราว.zip
ตัวอย่าง
นำเข้า zipfileimport ioimport pandas เป็น pdfile_name1 ="temporary_file1_for_zip.csv"file_name2 ="temporary_file2_for_zip.csv"file_name_list =[file_name1, file_name2]zip_file_name ="temporary.zip"_data for file "20s"Federal ,20Djokovic,17Murray,3"""# data สำหรับไฟล์ 2file_data_2 ="""player,titlesTheim,1Zverev,0Medvedev,0Rublev,0"""# เขียน file_data ไปยัง file_namewrite_data_to_files(file_data_1, file_name1)write_data_data_to_files, file zip file_name เป็น zip_file_namefile_compress(file_name_list, zip_file_name)ตัวอย่าง
5.นำทุกอย่างมารวมกันที่กล่าวถึงในขั้นตอนข้างต้น
# กำหนด data# ให้เราสร้างไฟล์ zip ด้วย fileimport เดียว zipfileimport ioimport pandas เป็น pd# Function :write_data_to_filesdef write_data_to_files(inp_data, file_name):"""function :สร้างไฟล์ csv ด้วยข้อมูลที่ส่งผ่านไปยัง codeargs นี้ :inp_data :ข้อมูลที่จะเขียนไปยังไฟล์เป้าหมาย filefile_name :ชื่อไฟล์เป้าหมายที่จะเก็บ datareturn :noneassumption :ไฟล์ที่จะสร้างและรหัสนี้อยู่ในไดเร็กทอรีเดียวกัน"""print(f" *** กำลังเขียนข้อมูลไปที่ - { file_name}")throwaway_storage =io.StringIO(inp_data) โดยเปิด (file_name, 'w') เป็น f:for บรรทัดใน throwaway_storage:f.write(line)# Function :file_compressdef file_compress(inp_file_names, out_zip_file):""" :file_compressargs :inp_file_names :รายชื่อไฟล์ที่จะ zippedout_zip_file :output zip filereturn :ไม่มีข้อสันนิษฐาน :ใส่เส้นทางของไฟล์และรหัสนี้อยู่ในไดเร็กทอรีเดียวกัน"""# เลือกโหมดการบีบอัด ZIP_DEFLATED สำหรับการบีบอัด# หรือ zipfile.ZIP_STORED เพื่อจัดเก็บไฟล์บีบอัด =zipfile.ZIP_DEFLA TEDprint(f" *** ป้อนชื่อไฟล์ที่ส่งสำหรับการซิป - {inp_file_names}")# สร้างไฟล์ zip เส้นทาง/ชื่อพารามิเตอร์แรก โหมดที่สอง (f' *** out_zip_file คือ - {out_zip_file}')zf =zipfile ZipFile(out_zip_file, mode="w")try:for file_to_write in inp_file_names:# เพิ่มไฟล์ในไฟล์ zip# ไฟล์พารามิเตอร์ตัวแรกเป็น zip ชื่อไฟล์ที่สองใน zipprint(f' *** กำลังประมวลผลไฟล์ {file_to_write}')zf write(file_to_write, file_to_write, compress_type=compression) ยกเว้น FileNotFoundError เป็น e:print(f' *** ข้อยกเว้นเกิดขึ้นระหว่างกระบวนการ zip - {e}') ในที่สุด:# อย่าลืมปิดไฟล์!zf.close() # __main__ programif __name__ =='__main__':# กำหนดชื่อไฟล์ของคุณและ datafile_name1 ="temporary_file1_for_zip.csv"file_name2 ="temporary_file2_for_zip.csv"file_name_list =[file_name1, file_name2]zip_file_name ="temporary. ,titlesFederer,20Nadal,20Djokovic,17Murray,3"""file_data_2 ="""player,titlesTheim,1Zverev,0Medvedev,0Rublev,0"""# เขียน file_data ไปยัง file_namewrite_d ata_to_files(file_data_1, file_name1)write_data_to_files(file_data_2, file_name2)# zip file_name เป็น zip_file_namefile_compress(file_name_list, zip_file_name)*** กำลังเขียนข้อมูลไปที่ - temporary_file1_for_zip.csv*** กำลังเขียนข้อมูลไปที่ - temporary_file2_for_zip.csv*** ป้อนชื่อไฟล์ที่ส่งสำหรับการซิป - ['temporary_file1_for_zip.csv', 'temporary_file2_for_zip.csv']** * out_zip_file คือ - temporary.zip*** กำลังประมวลผลไฟล์ temporary_file1_for_zip.csv*** กำลังประมวลผลไฟล์ชั่วคราว_file2_for_zip.csvผลลัพธ์
เมื่อโค้ดด้านบนถูกรัน ผลลัพธ์จะเป็น
-
temporary_file1_for_zip.csv สร้างขึ้นในไดเร็กทอรีปัจจุบัน
-
temporary_file2_for_zip.csv สร้างขึ้นในไดเร็กทอรีปัจจุบัน
-
ไฟล์ชั่วคราว.zip ถูกสร้างขึ้นในไดเร็กทอรีปัจจุบัน