Đọc file csv mã TCVN3 với pandas trong python

Xin chào mọi người,

Em có thể hỏi chút về đọc file csv encoding TCVN3 trong python với thư viện pandas như thế nào được không ạ.

Em có tìm google mà không thể tìm thấy hướng dẫn.
Em chỉ đơn thuần dùng như sau:

import os
import pandas as pd

pd.read_csv('filename.csv')

thrown ra cái này:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 448, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 880, in __init__
    self._make_engine(self.engine)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 1114, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 1891, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 529, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 749, in pandas._libs.parsers.TextReader._get_header
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 1: invalid start byte

Em thử:

pd.read_csv('filename.csv', encoding='utf8')

thì thrown:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 448, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 880, in __init__
    self._make_engine(self.engine)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 1114, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 1891, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 529, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 749, in pandas._libs.parsers.TextReader._get_header
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 1: invalid start byte
>>> pd.read_csv("2500_dp01.csv", encoding='utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 448, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 880, in __init__
    self._make_engine(self.engine)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 1114, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 1891, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 529, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 720, in pandas._libs.parsers.TextReader._get_header
  File "pandas\_libs\parsers.pyx", line 916, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 2063, in pandas._libs.parsers.raise_parser_error
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 1: invalid start byte

Mong có thể nhận được hướng dẫn từ anh chị ạ, em tìm thì đều không có hướng dẫn cho python, chỉ có cho các ngôn ngữ khác.

Em cảm ơn anh chị.

Bạn cho nó đọc dạng ANSI (cũng có thể là ASCII) nhé. Mặc định là UTF-8. TCVN3 biến đổi từ bảng mã ANSI mà bạn.

3 Likes

Dạ em vừa thử mã lỗi ạ

>>> pd.read_csv("filename.csv", encoding='ASCII')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 448, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 880, in __init__
    self._make_engine(self.engine)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 1114, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "C:\Program Files (x86)\Python38-32\lib\site-packages\pandas\io\parsers.py", line 1891, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas\_libs\parsers.pyx", line 529, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas\_libs\parsers.pyx", line 720, in pandas._libs.parsers.TextReader._get_header
  File "pandas\_libs\parsers.pyx", line 916, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 2063, in pandas._libs.parsers.raise_parser_error
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb7 in position 1: ordinal not in range(128)

Em có tìm được link này vẫn đang open issue của python.org,

Có vẻ như Python chưa có hỗ trợ và đang có một vài anh chị muốn support cái này

Python Bugs

Em có thử đọc và sử dụng bảng mã CP1252 tuy có đọc được nhưng lỗi font.

2 Likes

Cái ASCII thì chỉ từ 0 -> 127 còn ANSI thì 0 -> 255.
Bạn thử ANSI chưa?

4 Likes

Dạ ANSI cũng đọc được ạ. Em cảm ơn anh nhiều.

Vậy là mình có thể đọc bảng mã ANSI hoặc CP1258, tuy nhiên dữ liệu sẽ cần convert qua utf8 đúng không ạ?

Không “lỗi font” gì hết, thế là được rồi đấy. TCVN3 hiển thị tiếng Việt bằng cách thay thế kí tự mà. Phải có bộ phông chữ phù hợp (bắt đầu bằng .Vn) thì mới hiển thị đúng.
Kí tự muốn hiển thị với bộ phông tương thích:

Em có thử đọc và sử dụng bảng mã CP1252 tuy có đọc được nhưng lỗi font

Chuỗi thực sự ở CP1252:

Em cã thö ®äc vµ sö dông b¶ng m· CP1252 tuy cã ®äc ®­îc nh­ng lçi font

Nhìn vào bạn sẽ thấy các kí tự tiếng Việt được hiển thị nhờ “thay hình đổi dạng” của các kí tự ANSI.

ã -> ó
ö -> ử
...
4 Likes

Vậy là nếu em muốn ‘convert’ qua utf8 thì em sẽ cần một hàm replace string là sẽ được đúng không ạ.

Em cảm ơn anh nhiều!

Em mới tìm được một link

Em cảm ơn anh SITUVN.gcd ạ!

2 Likes

Giờ em đã hiểu tại sao lại cần font .vnH và font .vn
Bởi đơn giản là không đủ chỗ cho các ký tự viết hoa có dấu nên bắt buộc phải dùng font để lòe hiển thị chữ hoa. Và em cũng hiểu tại sao chương trình ở công ty những khách hàng có tên có dấu như ánh hay bị ghi là áNH mặc dù mình đã viết hoa.

Cảm ơn anh SITUVN.gcd nhiều ạ!

4 Likes

Bạn hiểu ra nhiều và rất đúng hướng rồi đấy. Chúc mừng bạn.

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?