Đây là bài viết phải đọc đối với những người thường xuyên xử lý các tệp Unicode [áp dụng cho cả các bảng mã khác] trong công việc hàng ngày của họ. Xử lý các tệp Unicode với tư cách là một học viên xử lý ngôn ngữ tự nhiên là một cơn ác mộng, đặc biệt nếu bạn đang sử dụng hệ điều hành Windows. Hãy tưởng tượng sự thất vọng khi bạn gặp lỗi trong quá trình mã hóa hoặc giải mã chẳng hạn như
UnicodeEncodeError: 'mbcs' codec can't decode characters in positionUnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position
Hầu hết thời gian, những lỗi như vậy không đủ thông tin trừ khi bạn là người kỳ cựu trong lĩnh vực này. Bạn có thể hỏi tại sao chúng ta cần mã hóa và giải mã các ký tự. Hãy bắt đầu với một lời giải thích đơn giản về Unicode. Dựa trên tài liệu chính thức về python, Unicode [Bộ ký tự được mã hóa chung] là một đặc điểm kỹ thuật nhằm liệt kê mọi ký tự được sử dụng bởi ngôn ngữ của con người và cung cấp cho mỗi ký tự mã duy nhất của riêng nó. Các thông số kỹ thuật Unicode liên tục được sửa đổi và cập nhật để thêm các ngôn ngữ và ký hiệu mới
Do đó, mã hóa và giải mã phục vụ như một cách để ánh xạ các ký tự từ văn bản sang byte hoặc ngược lại. Điều này cho phép chúng tôi chuyển chúng giữa các máy tính và sử dụng chúng trong cuộc sống hàng ngày của chúng tôi. Nó trở nên phức tạp hơn khi bạn có các bộ hệ điều hành khác nhau. Ngoài ra, các ngôn ngữ khác nhau có bộ ký tự riêng chỉ có thể hiển thị dưới một số phông chữ nhất định. Để đơn giản, hãy coi nó giống như dịch một ký tự nước ngoài sang một ký tự mà máy móc hiểu được. Trong bài viết này, chúng ta sẽ khám phá một số phương pháp có thể được sử dụng để xử lý các tệp Unicode trong Python. Hãy bắt đầu với các chế độ có sẵn và mã hóa tiêu chuẩn
Đọc hoặc ghi tệp thông qua trình quản lý ngữ cảnh
Cách an toàn nhất để mở tệp là thông qua trình quản lý ngữ cảnh bằng cách sử dụng câu lệnh with. Nó sẽ tự động đóng tệp cho chúng tôi ngăn chặn mọi sự cố có thể phát sinh
Chế độ mặc định là 'rt'
dùng để đọc và tệp văn bản. Bạn có thể viết bằng đoạn mã sau
Đoạn mã trên sẽ ghi đè và cắt bớt tệp. Trong một số trường hợp, bạn có thể thích sử dụng chế độ 'a'
thay vì 'w'
. Danh sách sau đây hiển thị các chế độ hoàn chỉnh có sẵn
- r. mở để đọc [mặc định]
- w. mở để viết, cắt bớt tệp trước
- x. mở để tạo độc quyền, không thành công nếu tệp đã tồn tại
- a. mở để viết, thêm vào cuối tệp nếu nó tồn tại
- b. chế độ nhị phân
- t. chế độ văn bản [mặc định]
- +. mở tệp đĩa để cập nhật [đọc và ghi]
Bạn có thể kết hợp một số chế độ. , đối với quyền truy cập đọc-ghi nhị phân, chế độ 'w+b'
sẽ mở và cắt bớt tệp thành 0 byte. 'r+b'
mở tệp mà không cắt bớt
Mã hóa tiêu chuẩn trong Python
Để chỉ định mã hóa trong Python, bạn chỉ cần chuyển vào một đối số khác trong quá trình khởi tạo trình quản lý ngữ cảnh. Bạn phải chỉ định nó bất cứ khi nào bạn đang đọc hoặc viết các ký tự Unicode. Ví dụ sau đây cho thấy cách thích hợp để nối văn bản Unicode vào một tệp hiện có
Nếu bạn không chắc nên sử dụng mã hóa nào, chỉ cần nhập utf8
và kiểm tra lỗi. Hầu hết thời gian, UTF-8 đủ tốt để mã hóa và giải mã các ký tự. Tuy nhiên, có một số trường hợp bạn cần sử dụng bảng mã khác để thay thế. Kiểm tra những điều sau đây để tìm hiểu thêm về các mã hóa có sẵn. Nếu bạn không biết mã hóa nào được sử dụng trong tệp của mình thì sao?
Kiểm tra loại mã hóa qua Notepad++
Cá nhân, tôi thích sử dụng Notepad ++ hơn để xem nội dung tệp. Nếu bạn mở tệp bằng Notepad++, bạn có thể thấy loại mã hóa được sử dụng ở dưới cùng bên phải của giao diện người dùng
Một tệp ví dụ đã sử dụng mã hóa UTF-8. Hình ảnh của tác giả
Bạn có thể sửa đổi mã hóa thông qua menu Mã hóa. Nó chấp nhận một loạt các mã hóa được sử dụng phổ biến nhất
Hình ảnh hiển thị menu thả xuống khi nhấp vào menu mã hóa. Hình ảnh của tác giả
Nếu bạn đã từng gặp sự cố không thể chuyển đổi tệp sang mã hóa khác hoặc không đọc được một số mã hóa nhất định mặc dù bạn đã chỉ định chính xác, bạn có thể thử phương pháp ngu ngốc nhưng hiệu quả sau đây
- Tạo một tệp văn bản trống với các mã hóa mà bạn mong muốn
- Sao chép tất cả nội dung từ tệp gốc
- Dán nó vào tệp mới và lưu nó
Hầu hết thời gian, điều này sẽ tự động chuyển đổi tất cả các ký tự thành mã hóa mới. Xin lưu ý rằng có thể mất dữ liệu nếu không thể chuyển đổi ký tự dựa trên mã hóa mới
Xử lý các ký tự trong một mã hóa không xác định
Nếu bạn từng rơi vào trường hợp không xác định được mã hóa và các ký tự hóa ra là một thứ gì đó không xác định, bạn có thể thử sửa đổi đối số lỗi để giải quyết vấn đề
Đối số lỗi đề cập đến cách xử lý lỗi mã hóa và giải mã. Xin lưu ý rằng đối số này không thể được sử dụng ở chế độ nhị phân. Các trình xử lý lỗi có sẵn là
- nghiêm khắc. để đưa ra một ngoại lệ
ValueError
nếu có lỗi mã hóa. Giá trị mặc định củaNone
có tác dụng tương tự - phớt lờ. bỏ qua lỗi. Lưu ý rằng bỏ qua lỗi mã hóa có thể dẫn đến mất dữ liệu
- thay thế. làm cho một điểm đánh dấu thay thế [chẳng hạn như
file_path = 'C:\path\to\数据分析\data.csv'
0] được chèn vào nơi có dữ liệu không đúng định dạng - người thay thế. sẽ biểu thị bất kỳ byte không chính xác nào dưới dạng các điểm mã trong Khu vực sử dụng riêng của Unicode, từ U+DC80 đến U+DCFF. Các điểm mã riêng tư này sau đó sẽ được chuyển trở lại thành các byte giống nhau khi trình xử lý lỗi này được sử dụng để ghi dữ liệu. Điều này hữu ích để xử lý các tệp ở dạng mã hóa không xác định
- xmlcharreplace. chỉ được hỗ trợ khi ghi vào một tập tin. Các ký tự không được mã hóa hỗ trợ được thay thế bằng tham chiếu ký tự XML thích hợp
file_path = 'C:\path\to\数据分析\data.csv'
1 - dấu gạch chéo ngược thay thế. thay thế dữ liệu không đúng định dạng bằng chuỗi thoát dấu gạch chéo ngược Python
- tên thay thế. [cũng chỉ được hỗ trợ khi viết] thay thế các ký tự không được hỗ trợ bằng chuỗi ký tự thoát
file_path = 'C:\path\to\数据分析\data.csv'
2
Hiển thị các ký tự Unicode trong dấu nhắc lệnh
Nếu bạn đang chạy dấu nhắc lệnh trong hệ điều hành Windows, nó sẽ gặp sự cố hiển thị ký tự Unicode hầu hết thời gian. hóa ra các ký tự vô nghĩa giống như hình dưới đây
Để giải quyết vấn đề này, chúng tôi cần thay đổi cài đặt thành phông chữ chính xác
- Nhấp chuột phải vào menu trên cùng và nhấp vào thuộc tính
- Nhấp vào menu phông chữ
- Sửa đổi phông chữ thành phông chữ mong muốn có thể hiển thị ký tự. Ví dụ: bạn có thể sử dụng phông chữ KaiTi để hiển thị các ký tự tiếng Trung
Thuộc tính phông chữ của dấu nhắc lệnh. Hình ảnh của tác giả
Mở đường dẫn tệp có ký tự Unicode — áp dụng cho read_csv qua mô-đun pandas
Phần này hơi phức tạp, đặc biệt khi bạn đang sử dụng một số mô-đun Python chẳng hạn như gấu trúc. Giả sử bạn có đường dẫn tệp sau bằng ngôn ngữ không phải tiếng Anh
file_path = 'C:\path\to\数据分析\data.csv'
Cố gắng đọc tệp qua read_csv sẽ gây ra lỗi đơn giản vì đường dẫn tệp chứa các ký tự Unicode. Đây không phải là vấn đề nếu bạn đang sử dụng hàm open[] tích hợp sẵn trong Python. Để giải quyết vấn đề này, trước tiên chúng ta cần mở tệp, sau đó chuyển tệp đó vào hàm read_csv
Phần kết luận
Hãy tóm tắt lại những gì chúng tôi đã đề cập trong hướng dẫn này. Đầu tiên, chúng tôi đã học được tầm quan trọng của việc sử dụng trình quản lý ngữ cảnh [có câu lệnh] khi đọc và ghi tệp. Chúng tôi đã tiếp xúc với danh sách các chế độ có sẵn và mã hóa tiêu chuẩn có thể được sử dụng trong Python. Bây giờ chúng ta đã biết sử dụng một trình soạn thảo văn bản hiện có như Notepad++ để cung cấp cho chúng ta cái nhìn thoáng qua về mã hóa và cấu trúc của tệp đầu vào. Nếu có bất kỳ ký tự nào có mã hóa không xác định, chúng tôi có thể xử lý ký tự đó thông qua đối số lỗi trong quá trình khởi tạo. Đối với người dùng Windows, có một tùy chọn sửa đổi phông chữ trong dấu nhắc lệnh để hiển thị đúng văn bản Unicode. Cuối cùng, chúng tôi đã học cách mở tệp trước khi sử dụng mô-đun pandas để đọc bất kỳ tập dữ liệu nào. cám ơn vì đã đọc và chúc một ngày tốt lành