Làm thế nào để bạn bỏ qua lỗi unicode trong python?

Đâ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

  1. 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
  2. Sao chép tất cả nội dung từ tệp gốc
  3. 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ủa None 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

Dấu nhắc lệnh hiển thị các ký tự vô nghĩa. Hình ảnh của tác giả

Để 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

  1. Nhấp chuột phải vào menu trên cùng và nhấp vào thuộc tính
  2. Nhấp vào menu phông chữ
  3. 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

Lỗi thoát unicode trong Python là gì?

Khi chúng ta sử dụng một chuỗi như vậy làm tham số cho bất kỳ chức năng nào, có khả năng xảy ra lỗi. Lỗi như vậy được gọi là lỗi Unicode trong Python. Chúng tôi gặp lỗi như vậy vì bất kỳ ký tự nào sau chuỗi thoát Unicode (“ \u ”) tạo ra lỗi, đây là lỗi điển hình trên cửa sổ .

Làm cách nào để chuyển đổi các ký tự unicode thành chuỗi trong Python?

type(title) == unicode và type(title. mã hóa ('utf-8')) == str. .
Điều này sẽ chỉ hoạt động trên windows. .
Điều này bị hỏng nếu nội dung của chuỗi thực sự là unicode, không chỉ các ký tự ascii trong chuỗi unicode