각 행의 column 개수가 다른 파일을 pandas의 read_table로 불러오는 방법이 없을까요?

조회수 519회

예를 들어

1 2
2 3 4
3

이런 식의 파일을 pandasread_table로 불러오려고 하는데 첫 행의 1 2를 보고선 칼럼이 2개라고 자동으로 인식을 해서 2 3 4가 있는 두번째 행에서 tokenizing error가 나더군요.

불러와야 할 텍스트 파일이 24개인데 텍스트 파일 하나가 1GB를 넘어가서 여는데만 시간이 꽤나 걸리기도 하고 해서 하나하나 최대 칼럼을 가진 행을 제일 위로 끌어올리기도 힘든 상황입니다.

모든 데이터가 다 필요한지라 bad_line_error = False 옵션을 사용하는 것도 좀 마음에 걸리구요.

open().read().splitlines 로 리스트화 해서 dataframe에 넣으려고 했더니 메모리 부족으로 코드가 중단됩니다. (물론 64bit 버전으로 받았습니다)

칼럼 개수를 미리 지정해둘 수 있으면 좋을거 같은데 방법이 안 떠오르네요. 혹시 아시는 분 계시면 조언 부탁드립니다.

1 답변

  • 대충 찾아보니.. 그냥 다 1열에 받아버린 다음 각 행을 돌면서 적당히 쪼개서 쓰는 방법도 있을듯 하네요. https://stackoverflow.com/a/50914351

    근데 저라면 좀 귀찮더라도:

    1. 파일을 csv로 변환합니다. 스크립트를 만들든지 아니면 그냥 해당 파일을 엑셀로 열어서 별 생각없이 다른 이름으로 저장 합니다.
    2. read_csv()를 돌립니다.

    원시데이터의 delimiter가 띄어쓰기 인 거라면, 원시데이터 파일을 읽어서, 띄어쓰기가 제일 많은 행을 찾아서, 몇 개의 띄어쓰기가 있는지 구하면, 거기에 +1 한 값이 컬럼 수 최대값이 될 겁니다. 그냥 대충 그거 가지고 어떻게 하면 될듯 한데요.

    행운을 빕니다.

    • 애초에 텍스트 파일 하나가 1GB를 넘어가버려서 8GB ram인 랩탑에서는 pandas의 read_csv가 메모리를 95% 이렇게 차지하더군요... open()으로 열면 메모리는 그닥 안 잡아먹긴 하는데 230만 라인 이상을 반복문으로 split 해서 pandas에 넣으려니 이것도 메모리 부족 오류가 뜨구요.. ㅎㅎ stackoverflow랑 구글링으로 일단 dask.dataframe을 이용해서 개행 기준으로 불러와서 필요한 부분만 남기고 pandas로 변환하는 방식을 취하니 메모리는 그런대로 절약이 되기는 했습니다만.. 속도가 많이 느리네요.. 답변 감사합니다 알 수 없는 사용자 2021.4.30 14:13

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)