파이썬(Python)/pandas

[Python] Pandas CSV 파일 읽기 (에러 발생/해결)

끄적끄적아무거나 2022. 3. 5. 21:09
반응형

 

목차

     

     

     

     

     

     

    파이썬 판다스로 CSV 파일 읽기 문제 발생

     

    이번 포스트는 어떤 프로그램을 통해서 데이터를 저장하였고 저장은 csv file로 하였습니다. 데이터 분석을 위해 pandas dataframe을 사용하려고 하는데 csv 를 불러 오는 과정에서 에러가 발생하였습니다. 

     

    해결 방법에는 2가지가 있는데 아래에서 소개하겠습니다.(CSV file to dataframe/series))

     

    우선 아래 예제 코드 처럼 pandas의 read_csv 함수를 사용해서 동일 폴더 안에 있는 csv file을 읽는 코드를 작성했습니다.

     

    예제 코드>>

    import pandas as pd
    
    data = pd.read_csv('Driving_data_long.csv')
    print(data)

     

    에러 코드>>

    Traceback (most recent call last):
      File "d:\py_test\test00\test03.py", line 3, in <module>
        data = pd.read_csv('Driving_data_long.csv')
      File "C:\Users\forgo\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\util\_decorators.py", line 311, in wrapper
        return func(*args, **kwargs)
      File "C:\Users\forgo\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\readers.py", line 680, in read_csv
        return _read(filepath_or_buffer, kwds)
      File "C:\Users\forgo\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\readers.py", line 581, in _read
        return parser.read(nrows)
      File "C:\Users\forgo\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\readers.py", line 1250, in read
        index, columns, col_dict = self._engine.read(nrows)
      File "C:\Users\forgo\AppData\Local\Programs\Python\Python310\lib\site-packages\pandas\io\parsers\c_parser_wrapper.py", line 225, in read
        chunks = self._reader.read_low_memory(nrows)
      File "pandas\_libs\parsers.pyx", line 805, in pandas._libs.parsers.TextReader.read_low_memory
      File "pandas\_libs\parsers.pyx", line 861, in pandas._libs.parsers.TextReader._read_rows
      File "pandas\_libs\parsers.pyx", line 847, in pandas._libs.parsers.TextReader._tokenize_rows
      File "pandas\_libs\parsers.pyx", line 1960, in pandas._libs.parsers.raise_parser_error
    pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 3, saw 4

     

    일반적인 csv 파일은 읽는데 문제가 발생하지 않았지만 이번 csv 파일에서 문제가 발생한 것은 에러 코드에서 확인할 수 있듯이 parser 에서 문제가 발생하였습니다. 

     

    csv 파일에서 encoding에서 발생한 문제로 보입니다.

     

     

     

     

    파이썬 판다스로 CSV 파일 읽기 해결 방법 #1

     

    첫번째 해결 방법은 read_csv 함수에 rb라는 인자를 아래와 같이 넣습니다. rb 는 읽기 모드를 binary로 한다는 뜻입니다.

     

    예제 코드>>

    import pandas as pd
    
    data = pd.read_csv('Driving_data_long.csv', "rb")
    print(data)

     

    결과>>

    sys:1: FutureWarning: In a future version of pandas all arguments of read_csv except for the argument 'filepath_or_buffer' will be keyword-only.
    d:\py_test\test00\test03.py:3: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
      data = pd.read_csv('Driving_data_long.csv', "rb")
                                           #HEADER
    0                                      #TITLES
    1      ,,GPS@speed_kmh.RN_1,GPS@speed_kmh.RN_1
    2                                       #UNITS
    3                                  ,,km/h,m/s2
    4                                   #DATATYPES
    ...                                        ...
    81091             81085,81084.000,29.68,-1.718
    81092             81086,81085.000,22.17,-1.656
    81093             81087,81086.000,15.15,-1.612
    81094             81088,81087.000,10.36,-1.613
    81095             81089,81088.000,7.519,-1.605
    
    [81096 rows x 1 columns]

     

    하나의 열에 값이 다 들어갔기 때문에 결과 값을 dataframe에서 다시 처리해줘야 합니다.

     

     

     

     

     

     

    파이썬 판다스로 CSV 파일 읽기 해결 방법 #2

     

    다음은 csv 라이브러리로 읽는 방법입니다. 

     

    예제 코드>>

    import csv
    
    with open('Driving_data_long.csv', newline='') as csvfile:
        spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
        for row in spamreader:
            print(', '.join(row))

     

    결과>>

    7802,7801.000,17.41,-0.2558
    7803,7802.000,16.52,-0.2148
    7804,7803.000,15.9,-0.1709
    7805,7804.000,15.6,-0.1243
    7806,7805.000,15.48,-0.07514
    7807,7806.000,15.49,-0.0214

     

     

    결과가 정상적으로 출력 되었습니다. 해당 파일은 , 로 분류해서 np.arrary에 넣어서 dataframe으로 옮겨야 합니다.

    반응형