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

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

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



답변

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 페이지 참조 )를 사용할 수 있습니다.


답변

가장 간단한 솔루션 :

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"


답변

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, ...)

답변

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

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

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

거기 당신은 간다


답변

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

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


답변

필자의 경우 이것은 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) 


답변

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

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