
Phát hiện trùng mã chi tiết trong cả thư mục: gom các file cùng MA_CHI_TIET và báo cáo
#Python#Attribute#Kiểm tra1 lượt xem
Quản trị viênQuản trị· 0 điểm
Câu hỏi ·
Hai file khác nhau cùng mang một mã chi tiết là lỗi dữ liệu nghiêm trọng, gây nhầm khi đặt hàng. Script quét thư mục, gom file theo mã và liệt kê các mã bị trùng.
Phát hiện trùng mã chi tiết trong cả thư mụcCác bước thực hiện
- Quét thư mục. Danh sách .prt.
- Đọc MA_CHI_TIET. Mở part, đọc thuộc tính, đóng part.
- Gom theo mã. Dict mã -> danh sách file.
- Tìm trùng. Mã có nhiều hơn một file.
- Báo cáo. Mã trùng và các file liên quan; mã thiếu.
Code tham khảo (Python)
import os from collections import defaultdict import NXOpen KIEU = NXOpen.NXObject.AttributeType def doc_ma(duong_dan, session): part, st = session.Parts.Open(duong_dan) st.Dispose() try: if part.HasUserAttribute("MA_CHI_TIET", KIEU.String, -1): return part.GetUserAttributeAsString("MA_CHI_TIET", KIEU.String, -1).strip() return "" finally: part.Close(NXOpen.BasePart.CloseWholeTree.FalseValue, NXOpen.BasePart.CloseModified.CloseModified, None) def main(thu_muc="D:/Du_an/ban_ve"): session = NXOpen.Session.GetSession() lw = session.ListingWindow lw.Open() theo_ma = defaultdict(list) thieu = [] for goc, _, files in os.walk(thu_muc): for ten in sorted(files): if not ten.lower().endswith(".prt"): continue duong_dan = os.path.join(goc, ten).replace("\\", "/") try: ma = doc_ma(duong_dan, session) except Exception as ex: lw.WriteLine("Không đọc được %s: %s" % (duong_dan, ex)) continue if ma: theo_ma[ma.upper()].append(duong_dan) else: thieu.append(duong_dan) trung = {m: ds for m, ds in theo_ma.items() if len(ds) > 1} lw.WriteLine("Mã trùng: %d, file thiếu mã: %d, tổng mã khác nhau: %d" % (len(trung), len(thieu), len(theo_ma))) for ma, ds in sorted(trung.items()): lw.WriteLine(" %s:" % ma) for d in ds: lw.WriteLine(" - " + d) for d in thieu[:20]: lw.WriteLine(" THIẾU MÃ: " + d) if __name__ == "__main__": main()Giải thích code
defaultdict(list)tự tạo danh sách cho mã mới nên không cần kiểm tra khóa tồn tại.- Chuẩn hóa mã sang chữ hoa trước khi so sánh để
ct-01vàCT-01được coi là một. - Chỉ in 20 file thiếu mã đầu tiên để báo cáo gọn; ghi CSV nếu cần danh sách đầy đủ.
Lỗi thường gặp
- Cùng một file nằm ở hai thư mục (bản sao lưu) sẽ bị tính trùng; loại thư mục
backupkhỏi quét. - Mở từng file để đọc mã khá chậm; cache kết quả theo ngày sửa file cho lần quét sau.
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.