NX Lab

Đóng gói bộ hồ sơ giao hàng: nén thư mục STEP, PDF, BOM thành file ZIP có mục lục

#Python#Giao hàng#ZIP1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Gửi khách hàng một thư mục lộn xộn gây mất thiện cảm. Bài này gom STEP, PDF, BOM vào thư mục chuẩn, tạo mục lục, rồi nén thành một file ZIP có tên ghi ngày.

    Đóng gói bộ hồ sơ giao hàng Đóng gói bộ hồ sơ giao hàng

    Các bước thực hiện

    1. Chuẩn bị thư mục. Thư mục tạm có ba nhóm STEP, PDF, BOM.
    2. Sao chép file. Từ nơi xuất sang thư mục đóng gói.
    3. Tạo mục lục. File README liệt kê nội dung và kích thước.
    4. Nén ZIP. zipfile với nén Deflate.
    5. Kiểm tra. Mở lại ZIP để đọc danh sách.

    Code tham khảo (Python)

    import os
    import shutil
    import time
    import zipfile
    import NXOpen
    
    NHOM = {"STEP": (".stp", ".step"), "PDF": (".pdf",), "BOM": (".csv", ".xlsx")}
    
    def gom_file(nguon, dich):
        da_chep = []
        for ten in sorted(os.listdir(nguon)):
            duoi = os.path.splitext(ten)[1].lower()
            for nhom, ds in NHOM.items():
                if duoi in ds:
                    thu_muc = os.path.join(dich, nhom)
                    os.makedirs(thu_muc, exist_ok=True)
                    shutil.copy2(os.path.join(nguon, ten), os.path.join(thu_muc, ten))
                    da_chep.append((nhom, ten, os.path.getsize(os.path.join(nguon, ten))))
        return da_chep
    
    def viet_muc_luc(dich, da_chep, ten_du_an):
        dong = ["HỒ SƠ GIAO HÀNG - " + ten_du_an, "Ngày: " + time.strftime("%Y-%m-%d"), ""]
        for nhom in NHOM:
            dong.append("[%s]" % nhom)
            for n, ten, kich in da_chep:
                if n == nhom:
                    dong.append("  %-40s %8.1f KB" % (ten, kich / 1024.0))
            dong.append("")
        with open(os.path.join(dich, "MUC_LUC.txt"), "w", encoding="utf-8") as f:
            f.write("\n".join(dong))
    
    def nen_zip(thu_muc, duong_dan_zip):
        with zipfile.ZipFile(duong_dan_zip, "w", zipfile.ZIP_DEFLATED) as z:
            for goc, _, files in os.walk(thu_muc):
                for ten in files:
                    day_du = os.path.join(goc, ten)
                    z.write(day_du, os.path.relpath(day_du, thu_muc).replace("\\", "/"))
        with zipfile.ZipFile(duong_dan_zip) as z:
            return z.namelist()
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        nguon = "D:/NXLab_xuat"
        dich = "D:/NXLab_giao_hang/goi_" + time.strftime("%Y%m%d")
        os.makedirs(dich, exist_ok=True)
        da_chep = gom_file(nguon, dich)
        viet_muc_luc(dich, da_chep, "Du an Mau")
        duong_dan_zip = dich + ".zip"
        ds = nen_zip(dich, duong_dan_zip)
        lw.WriteLine("Đã đóng gói %d file vào %s" % (len(ds), duong_dan_zip))
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • shutil.copy2 giữ nguyên ngày sửa file khi sao chép.
    • zipfile.ZIP_DEFLATED bật nén; mặc định là lưu không nén.
    • Mở lại ZIP vừa tạo để đọc danh sách là cách kiểm tra file không hỏng.

    Lỗi thường gặp

    • Thư mục nguồn lẫn file của dự án khác sẽ bị đóng gói nhầm; dùng thư mục xuất riêng cho từng dự án.
    • File ZIP lớn gửi qua email dễ bị chặn; chia nhỏ hoặc dùng link chia sẻ.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.