programing

Pandas에서 CSV 파일을 읽을 때 UnicodeDecodeError가 발생

closeapi 2023. 5. 11. 21:27
반응형

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_csv를 보다encoding다른 형식의 파일을 처리하는 옵션입니다.주로 사용합니다.read_csv('file', encoding = "ISO-8859-1") 또는그대에신atively에▁or▁altern대.encoding = "utf-8" 위해서, 그리고 일반적으로 독용고일로반으적리그서로,▁reading▁for으일,.utf-8위해서to_csv.

여러 개 중 하나를 사용할 수도 있습니다.alias과 같은 'latin'또는'cp1252') 대신 ('ISO-8859-1'(발생할 수 있는 다른 수많은 인코딩에 대해서도 python 문서 참조).

관련 Pandas 설명서, csv 파일에 대한 python 문서 예제 및 SO에 대한 많은 관련 질문을 참조하십시오.좋은 배경 자료는 모든 개발자가 유니코드와 문자 집합에 대해 알아야 하는 것입니다.

하려면 (가 아닌 문자가 포함되어 있다고 하면),enca(man 페이지 참조) 또는file -i (linux) 또는file -I(osx) (man 페이지 참조).

가장 간단한 솔루션:

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

대체 솔루션:

숭고한 텍스트:

  • Sublime 텍스트 편집기 또는 VS Code에서 csv 파일을 엽니다.
  • 파일을 utf-8 형식으로 저장합니다.
  • 숭고하게 파일 클릭 -> 인코딩으로 저장 -> UTF-8

VS 코드:

VSCode의 아래쪽 막대에 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 파일입니다.처리에 Python Pandas는 Python Pandas와 .open(Python3을), (Python3을 가정),read_csv개체와 같은 파일을 허용합니다.여기서 사용할 일반적인 오류 매개 변수는 다음과 같습니다.'ignore'은 단지 나쁜 better) 다그것단인바를이억제뿐나할 (IMHO 더낫습니거이가트공적격지은im▁which).'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, ...)
    

이는 언급된 질문에 대한 보다 일반적인 스크립트 접근 방식입니다.

import pandas as pd

encoding_list = ['ascii', 'big5', 'big5hkscs', 'cp037', 'cp273', 'cp424', 'cp437', 'cp500', 'cp720', 'cp737'
                 , 'cp775', 'cp850', 'cp852', 'cp855', 'cp856', 'cp857', 'cp858', 'cp860', 'cp861', 'cp862'
                 , 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', 'cp874', 'cp875', 'cp932', 'cp949', 'cp950'
                 , 'cp1006', 'cp1026', 'cp1125', 'cp1140', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254'
                 , 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213', 'euc_kr'
                 , 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2'
                 , 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', 'latin_1', 'iso8859_2'
                 , 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9'
                 , 'iso8859_10', 'iso8859_11', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'johab'
                 , 'koi8_r', 'koi8_t', 'koi8_u', 'kz1048', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2'
                 , 'mac_roman', 'mac_turkish', 'ptcp154', 'shift_jis', 'shift_jis_2004', 'shift_jisx0213', 'utf_32'
                 , 'utf_32_be', 'utf_32_le', 'utf_16', 'utf_16_be', 'utf_16_le', 'utf_7', 'utf_8', 'utf_8_sig']

for encoding in encoding_list:
    worked = True
    try:
        df = pd.read_csv(path, encoding=encoding, nrows=5)
    except:
        worked = False
    if worked:
        print(encoding, ':\n', df.head())

하나는 python 버전(이 경우 3.7 python 3.7 표준 인코딩)에 사용할 수 있는 모든 표준 인코딩으로 시작합니다.다른 파이썬 버전에 대한 표준 인코딩의 사용 가능한 파이썬 목록은 여기에 제공됩니다.유용한 스택 오버플로 응답

데이터의 작은 청크에서 각 인코딩을 시도합니다. 작업 인코딩만 인쇄합니다.결과는 직접적으로 명백합니다.이 출력은 또한 'latin1'과 같은 인코딩이 오류가 발생하더라도 반드시 원하는 결과를 생성하지는 않는다는 문제를 해결합니다.

질문의 경우, 저는 문제가 있는 특정 접근법을 시도할 것입니다.CSV파일을 저장한 다음 발견된 작업 인코딩을 다른 모든 작업에 사용할 수 있습니다.

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

이 코드를 실행한 후에 당신은 'cisco.csv'의 인코딩을 발견하고 다음과 같이 코드를 실행할 것입니다.

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

추가해 보십시오.

import pandas as pd
df = pd.read_csv('file.csv', encoding='unicode_escape')

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

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

인코딩을 변경해 보십시오.저 같은 경우에는.encoding = "utf-16"일했다.

df = pd.read_csv("file.csv",encoding='utf-16')

이름이 제경, 파이입니다.USC-2 LE BOM메모장++에 따라 인코딩합니다.그렇다.encoding="utf_16_le"비단뱀을 위한.

희망합니다, 누군가에게 조금 더 빨리 답을 찾는 것이 도움이 됩니다.

의 인코딩을 먼저할 수 .chardet또는cchardet또는charset-normalizer:

from pathlib import Path
import chardet

filename = "file_name.csv"
detected = chardet.detect(Path(filename).read_bytes())
# detected is something like {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

encoding = detected.get("encoding")
assert encoding, "Unable to detect encoding, is it a binary file?"

df = pd.read_csv(filename, encoding=encoding)

engine='timeout'을 지정해 보십시오.그것은 나에게 효과가 있었지만 나는 여전히 그 이유를 알아내려고 노력하고 있습니다.

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

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

한동안 고민하다가 첫 검색 결과인 만큼 이 질문에 글을 올려야겠다고 생각했습니다. 추가encoding="iso-8859-1"를 달다 ㅠㅠㅠㅠㅠㅠㅠㅠㅠread_csv작동하지도 않았고 다른 인코딩도 계속 유니코드 디코딩 오류를 발생시켰습니다.

파일핸 전경우는하달에에 .pd.read_csv(),당신은 그것을 넣을 필요가 있습니다.encoding 있는파속성, 있지않음에 있지 않은 read_csv나중에 생각해보면 명백하지만, 추적하기에는 미묘한 오류입니다.

이 문제가 발생할 수 있는 이유에 대해 업데이트된 해결책과 설명을 제공하기 위해 답변을 올립니다.데이터베이스 또는 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)

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

동일한 오류를 초래한 또 다른 중요한 문제는 다음과 같습니다.

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

^이 줄은 다음을 사용하여 엑셀 파일을 읽고 있기 때문에 동일한 오류가 발생했습니다.read_csv()방법.사용하다read_excel().svxs 파일을

이거 드셔보세요.

import csv
import pandas as pd
df = pd.read_csv(filepath,encoding='unicode_escape')

은행에서 받은 중국어로 데 . 저는 CSV 파일을 사용해 . 시도해 보았습니다.latin1요, 시다난했.iso-8859-1요, 시다난했.cp1252모두 허사로

하지만 단순히 일을 합니다.

이 답변은 CSV 인코딩 문제의 해결책인 것 같습니다.헤더에 다음과 같은 이상한 인코딩 문제가 발생하는 경우:

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

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

Python read csv - 첫 번째 키에 BOM 포함

에 CSV를 입니다.encoding="utf-8-sig":

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

이것이 누군가에게 도움이 되기를 바랍니다.

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

이것이 누군가에게 도움이 되기를 바랍니다.

저는 주피터 노트북을 사용하고 있습니다.그리고 제 경우에는 파일을 잘못된 형식으로 보여주고 있었습니다.'인코딩' 옵션이 작동하지 않습니다.그래서 저는 csv를 utf-8 형식으로 저장하고 작동합니다.

사용해 보십시오.

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

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

판다에게 전달하기 전에 암호화를 확인하십시오.속도를 늦출 수도 있지만...

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

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

파이썬 3.7에서

.csv 파일에만 문제가 발생할 수 있습니다.파일이 손상되었을 수 있습니다.이 문제에 직면했을 때.파일을 다시 csv로 'Save As(다른 이름으로 저장)'합니다.

0. Open the xls/csv file
1. Go to -> files 
2. Click -> Save As 
3. Write the file name 
4. Choose 'file type' as -> CSV [very important]
5. Click -> Ok 

저의 경우, 이전에 제공된 어떤 방법으로도 이 문제를 극복할 수 없었습니다.을 "" " " " " 로 utf-8,utf-16,iso-8859-1어떤 형태로든 작동하지 않았습니다.

하만사용대신는하지대신을 사용하는 에.pd.read_csv(filename, delimiter=';')사용했습니다;

pd.read_csv(open(filename, 'r'), delimiter=';')

그리고 모든 것이 잘 작동하는 것 같습니다.

다음을 사용할 수 있습니다.

df = pd.read_csv('./file_name.csv', encoding='gbk')

판다는 인코딩 스타일을 변경하여 문제가 되는 바이트를 자동으로 대체하지 않습니다.의 경우,를 내경인우매변변경수에서 입니다.encoding = "utf-8"encoding = "utf-16"문제를 해결했습니다.

언급URL : https://stackoverflow.com/questions/18171739/unicodedecodeerror-when-reading-csv-file-in-pandas

반응형