Python을 사용하여 Pandas에서 CSV 파일을 읽을 때 UnicodeDecodeError


411

30,000 개의 유사한 파일을 처리하는 프로그램을 실행 중입니다. 임의의 숫자 가이 오류를 중지하고 생성합니다 ...

   File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
     data = pd.read_csv(filepath, names=fields)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
     return _read(filepath_or_buffer, kwds)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
     return parser.read()
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
     ret = self._engine.read(nrows)
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
     data = self._reader.read(nrows)
   File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
   File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
   File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
   File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
   File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
   File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
   File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
   File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid    continuation byte

이러한 파일의 소스 / 작성은 모두 동일한 위치에서 제공됩니다. 가져 오기를 진행하기 위해 이것을 수정하는 가장 좋은 방법은 무엇입니까?

답변:


823

read_csvencoding다른 형식의 파일을 처리 하는 옵션을 사용합니다. 나는 주로을 사용 read_csv('file', encoding = "ISO-8859-1")하거나 대안 encoding = "utf-8"으로 독서를 utf-8위해 사용 to_csv합니다.

대신 여러 alias옵션 중 하나를 사용할 수도 있습니다 ( 파이썬 문서 참조 )'latin''ISO-8859-1'

참조 관련 팬더 문서 , CSV 파일에 대한 파이썬 문서 예 , 여기에 SO에 관련 질문을 많이. 좋은 백그라운드 리소스는 모든 개발자가 유니 코드 및 문자 집합에 대해 알아야 할 사항 입니다.

인코딩을 감지하려면 (파일에 ASCII가 아닌 문자가 포함되어 있다고 가정) enca( man 페이지 참조 ) 또는 file -i(linux) 또는 file -I(osx) ( man 페이지 참조 )를 사용할 수 있습니다.


7
이 문제는 Windows 문제 cp1252이므로을 선호 할 수 있습니다 iso-8859-1.
tzot

7
감사 pd.read_csv('immigration.csv', encoding = "ISO-8859-1", engine='python')합니다
Mona Jalal

8
예외가 발생하지 않기 때문에 특정 인코딩이 올바른 것으로 맹목적으로 가정하지 마십시오. 문자열을보고 해석이 적합한 지 파악해야합니다. 예를 들어 "hors d' œuvre"대신 "hors d' ½uvre"가 표시되면 ISO-8859-1에서 ISO-8859-15로 전환해야합니다.
요아킴 바그너

6
나를 위해 인코딩했다 ANSI. 그것을 알아 내기 위해 csv를 연 다음를 notepad클릭 save as하면 저장 버튼 옆에 인코딩이 표시됩니다.
Vaibhav Vishal


68

가장 간단한 솔루션 :

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

대체 솔루션 :

  • Sublime 텍스트 편집기 에서 csv 파일을여십시오 .
  • 파일을 utf-8 형식으로 저장하십시오.

숭고한 경우 파일-> 인코딩으로 저장-> UTF-8을 클릭하십시오.

그런 다음 평소와 같이 파일을 읽을 수 있습니다.

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')

다른 인코딩 유형은 다음과 같습니다.

encoding = "cp1252"
encoding = "ISO-8859-1"

11
이 질문에는 그러한 파일이 30,000 개가 있음을 설명합니다. 각 파일을 수동으로 여는 것은 실용적이지 않습니다.
Keith

4
적어도 하나의 파일에 대해서는 이것이 효과가있는 것 같습니다!
apil.tamang

C 엔진은 아마도 그것이 받아들이는 것에 더 관대합니다. 로 잘 열리는 특정 CSV 파일의 경우 encoding='iso-8859-1'대신 engine='python'throw를 사용하십시오 _csv.Error: field larger than field limit (131072).
그렉 베이컨

1
인코딩과 함께 저장을 사용하는 대체 솔루션이 정말 도움이되었습니다! VSCode에 사용하는 방법은 다음과 같습니다. stackoverflow.com/questions/30082741/…
brownmagik352

20

Pandas는 인코딩을 지정할 수 있지만 문제가되는 바이트를 자동으로 바꾸지 않는 오류는 무시할 수 없습니다. 따라서 모든 방법에 맞는 크기 는 없지만 실제 사용 사례에 따라 다른 방법이 있습니다.

  1. 인코딩을 알고 있으며 파일에 인코딩 오류가 없습니다. 훌륭함 : 인코딩 만 지정하면됩니다.

    file_encoding = 'cp1252'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
  2. 인코딩 질문에 신경 쓰지 않고 일부 텍스트 필드에 가비지가 있는지 여부에 관계없이 해당 파일 만로드하려고합니다. 좋아, Latin1가능한 바이트를 입력으로 받아들이고 동일한 코드의 유니 코드 문자로 변환하기 때문에 인코딩 만 사용해야 합니다.

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
  3. 대부분의 파일은 특정 인코딩으로 작성되었지만 인코딩 오류도 포함되어 있습니다. 실제 예는 utf8이 아닌 편집기로 편집되었으며 다른 인코딩을 가진 일부 행을 포함하는 UTF8 파일입니다. Pandas는 특별한 오류 처리를 제공하지 않지만 Python open함수에는 (Python3 가정) read_csv객체와 같은 파일을 허용합니다. 여기서 사용하는 일반적인 errors 매개 변수 'ignore'는 문제의 바이트를 억제하거나 (IMHO가 더 나은) 'backslashreplace'문제의 바이트를 Python의 백 슬래시 이스케이프 시퀀스로 대체합니다.

    file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
    pd.read_csv(input_fd, ...)

1
늦게 대답했지만 중복 질문을 목표로 ...
Serge Ballesta

14
with open('filename.csv') as f:
   print(f)

이 코드를 실행 한 후 'filename.csv'의 인코딩을 찾은 다음 다음과 같이 코드를 실행하십시오

data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"

거기 당신은 간다


6

필자의 경우 USC-2 LE BOM메모장 + +에 따르면 파일에 인코딩이 있습니다. 그것은이다 encoding="utf_16_le"파이썬을 위해.

희망, 그것은 누군가를위한 답변을 조금 더 빨리 찾는 데 도움이됩니다.


4

필자의 경우 이것은 Python 2.7에서 작동했습니다.

data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False) 

그리고 파이썬 3의 경우 :

data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False) 

3

engine = 'python'을 지정하십시오. 그것은 나를 위해 일했지만 여전히 이유를 알아 내려고 노력하고 있습니다.

df = pd.read_csv(input_file_path,...engine='python')

이것은 또한 나를 위해 일했습니다. 인코딩 = "ISO-8859-1"도 마찬가지였습니다. 분명히 인코딩 문제입니다. 특수 문자가 타원 문자 (예 : "...")와 같이 ANSI로 인코딩되어 UTF-8로 읽으려고하면 오류가 발생할 수 있습니다. 결론은 파일을 만든 인코딩을 알아야한다는 것입니다.
Sean McCarthy

3

이 문제가 발생할 수있는 이유에 대한 업데이트 된 솔루션 및 설명을 제공하는 답변을 게시하고 있습니다. 데이터베이스 또는 Excel 통합 문서에서이 데이터를 가져오고 있다고 가정하십시오. 인코딩을 La Cañada Flintridge city사용하여 데이터를 내 보내지 않는 한와 같은 특수 문자가있는 경우 UTF-8오류가 발생합니다. La Cañada Flintridge city될 것 La Ca\xf1ada Flintridge city입니다. pandas.read_csv기본 매개 변수를 조정하지 않고 사용 하면 다음 오류가 발생합니다.

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 5: invalid continuation byte

다행히도 몇 가지 해결책이 있습니다.

옵션 1 , 내보내기를 수정하십시오. UTF-8인코딩 을 사용하십시오 .

옵션 2 , 내보내기 문제점 수정을 사용할 수없고 사용해야 pandas.read_csv하는 경우 다음 매개 변수를 포함해야합니다 engine='python'. 기본적으로 팬더는 engine='C'큰 깨끗한 파일을 읽는 데 유용 하지만 예기치 않은 항목이 있으면 충돌합니다. 내 경험상 설정 encoding='utf-8'이이 문제를 해결하지 못했습니다 UnicodeDecodeError. 또한을 사용할 필요 errors_bad_lines는 없지만 실제로 필요한 경우 여전히 옵션 입니다.

pd.read_csv(<your file>, engine='python')

옵션 3 : 솔루션은 개인적으로 선호하는 솔루션입니다. 바닐라 파이썬을 사용하여 파일을 읽습니다.

import pandas as pd

data = []

with open(<your file>, "rb") as myfile:
    # read the header seperately
    # decode it as 'utf-8', remove any special characters, and split it on the comma (or deliminator)
    header = myfile.readline().decode('utf-8').replace('\r\n', '').split(',')
    # read the rest of the data
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('\r\n', '').split(',')
        data.append(row)

# save the data as a dataframe
df = pd.DataFrame(data=data, columns = header)

이것이 처음으로이 문제를 겪는 사람들에게 도움이되기를 바랍니다.


2

이 문제로 어려움을 겪고 첫 번째 검색 결과 이므로이 질문에 게시 할 것이라고 생각했습니다. encoding="iso-8859-1"팬더에 태그를 추가 read_csv해도 작동하지 않거나 다른 인코딩으로 인해 UnicodeDecodeError가 계속 발생했습니다.

파일 핸들을 전달하는 경우 파일이 아닌 파일 pd.read_csv(),encoding속성을 열어 두어야합니다 read_csv. 후시에는 분명하지만 추적하기에는 미묘한 오류가 있습니다.


2

추가하십시오

encoding='unicode_escape'

도움이 될 것입니다. 나를 위해 일했다. 또한 올바른 구분 기호 및 열 이름을 사용하고 있는지 확인하십시오.

파일을 빠르게로드하기 위해 1000 행만로드하는 것으로 시작할 수 있습니다.


1

이 답변은 CSV 인코딩 문제에 대한 포괄적 인 것으로 보입니다. 다음과 같이 헤더에 이상한 인코딩 문제가 발생하는 경우 :

>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])

그런 다음 CSV 파일의 시작 부분에 BOM (바이트 순서 표시) 문자가 있습니다. 이 답변은 문제를 해결합니다.

python csv 읽기-첫 번째 키에 BOM 포함

해결책은 다음을 사용하여 CSV를로드하는 것입니다 encoding="utf-8-sig".

>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])

잘하면 이것은 누군가를 돕는다.


1

이 오래된 스레드에 대한 업데이트를 게시하고 있습니다. 하나의 솔루션이 작동했지만 각 파일을 열어야합니다. LibreOffice에서 csv 파일을 열고 다른 이름으로 저장> 필터 설정 편집을 선택했습니다. 드롭 다운 메뉴에서 UTF8 인코딩을 선택했습니다. 그런 다음 encoding="utf-8-sig"data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig") .

이것이 누군가를 돕기를 바랍니다.


Nisse, 편집 해 주셔서 감사합니다. 무엇을 변경했는지 설명해 주시겠습니까? 차이가 보이지 않습니다.
tshirtdr1

1

나는 중국 온라인 은행에서 다운로드 단순화의 CSV 파일을 여는 문제가, 나는 시도했다 latin1, 나는 시도했다 iso-8859-1, 나는 시도cp1252 하는 모든 아무 소용.

그러나 pd.read_csv("",encoding ='gbk')간단하게 작동합니다.


0

Jupyter-notebook을 사용하고 있습니다. 그리고 제 경우에는 파일을 잘못된 형식으로 표시했습니다. '인코딩'옵션이 작동하지 않았습니다. 그래서 csv를 utf-8 형식으로 저장하면 작동합니다.


0

이 시도:

import pandas as pd
with open('filename.csv') as f:
    data = pd.read_csv(f)

인수를 통해 명시 적으로 표현하지 않고 인코딩을 처리하는 것처럼 보입니다.


0

팬더에게 전달하기 전에 인코딩을 확인하십시오. 속도가 느려지지만 ...

with open(path, 'r') as f:
    encoding = f.encoding 

df = pd.read_csv(path,sep=sep, encoding=encoding)

파이썬 3.7에서


0

내가 직면 한 또 다른 중요한 문제는 같은 오류가 발생했습니다.

_values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")

^이 줄은 read_csv()메소드를 사용하여 Excel 파일을 읽고 있기 때문에 동일한 오류가 발생했습니다 . 사용 read_excel()읽기 .xlxs에 대한


와우, 다른 사람들은 인코딩 문제에 대해 이야기하고 있습니다. 내 문제가 특이한 것 같습니다.
Mujeeb Ishaque

read_excel팬더 가 있기 때문 입니다.
애니 메논

0

당신은 이것을 시도 할 수 있습니다.

import csv
import pandas as pd
df = pd.read_csv(filepath,encoding='unicode_escape')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.