Tôi có một bộ sưu tập các tệp trong kho lưu trữ tệp MAC OS cũ. Tôi biết có vấn đề về tên tệp/tên đường dẫn với bộ sưu tập. Vấn đề bắt nguồn từ những gì tôi nghĩ là một điểm mã có trong đường dẫn được hiển thị dưới dạng dấu gạch ngang trong hệ điều hành gốc, nhưng Windows gặp khó khăn với các điểm mã và một trong số chúng chứa âm tiêu. trên ký tự trước đó hoặc với ?
thay thế nó
Tôi đang cố gắng tìm ra cách xác định "sự thật" của cấu trúc tệp để có thể chắc chắn rằng mình đang xem xét từng tệp.
Tôi đã xem qua các tập tin bằng một số công cụ nhưng không có kết quả trùng khớp. Tôi tin rằng những điều sau đây minh họa vấn đề.
#!/usr/bin/env trăn
# -*- mã hóa: utf-8 -*-
hệ điều hành nhập khẩu
thư mục = "email"
b = os.listdir(thư mục)
cho f trong b:
đại diện in(f)
in os.path.isfile(os.path.join(thư mục, f))
(Tôi đã phải sửa đổi tên tệp thực tế một chút)
kết quả:-
'tệp (1)'
ĐÚNG VẬY
'tệp (2)'
ĐÚNG VẬY
'tệp (3)?'
SAI
'tệp (4)'
ĐÚNG VẬY
Tên tập tin quan tâm là tập tin (3)?
, trong đó các điểm mã lẻ đã được giải mã thành ?
và đánh giá không phải là một tệp (hoặc thậm chí chuyển os.path.exists
hiện hữu). Xin lưu ý rằngin đại diện (chuỗi)
Cho biết rằng nó xử lý UTF-8, được mã hóa chính xác ?
.
Tôi có thể sao chép-dán tên tệp từ thư mục và nó ghi:tập tin(3)
Lưu ý thời kỳ.
Tôi có thể dán chuỗi vào trình soạn thảo của mình (subl) và thấy rằng bây giờ tôi có glyph điểm mã không thể hiển thị làm điểm mã cuối cùng
a = "tập tin (3)"
in một
đại diện in (a)
Đưa cho tôi:
tập tin(3)
'tệp(3)\xef\x80\xa9'
Từ đó tôi có thể thấy rằng các điểm mã lẻ là\xef\x80\xa9
. Ở những nơi khác trong bộ sưu tập tôi cũng tìm thấy các điểm mã \xef\x80\xa8
.
Tôi phải giả sử os.listdir
Những gì được trả về không phải là giá trị điểm mã ban đầu mà là một chuỗi được mã hóa (UTF-8?), việc thay thế điểm mã có nghĩa là khi nó kiểm tra tồn tại
hoặc tập tin isfile
Kiểm tra sự hiện diện của tên tệp sai kể từ khi thay thế ?
Tập tin không tồn tại.
Làm cách nào tôi có thể sử dụng các tập tin này một cách an toàn? Trong bộ sưu tập khoảng 700 tệp, tôi có khoảng 40 tệp.
尝试将 unicode
传递给 os.listdir
:
thư mục = u"email"
b = os.listdir(thư mục)
Làm như vậy sẽ dẫn đến os.listdir
Trả về danh sách unicode thay vì str
.
Thật không may, càng nghĩ về vấn đề này, tôi càng không hiểu tại sao nó lại có tác dụng. Cuối cùng, mọi hệ thống tệp đều sử dụng một số mã hóa để lưu trữ tên tệp của nó theo byte. Ví dụ như HDF+Lưu tên tệp ở định dạng UTF-16. Vì vậy, nếu os.listdir
Sẽ rất hợp lý nếu có thể trả về các byte thô này một cách dễ dàng nhất mà không bị tạp nhiễm. Tuy nhiên, trong trường hợp này,os.listdir
dường như trở lại trong sáng unicode
, nhưng không thể trả về byte thuần túy.
Nếu ai đó có thể giải thích bí ẩn này, tôi sẽ biết ơn.
Tôi là một lập trình viên xuất sắc, rất giỏi!