Python/Utils

파이썬 업로드 항목 생성, 올린 파일 읽기(코랩, 주피터 노트북 환경)

jimmy_AI 2022. 4. 4. 21:59
반응형

파이썬 ipynb 환경 내 파일 업로드 과정 구축

파이썬의 Colab 및 Jupyter Notebook 환경 하에서 사용자에게 파일을 업로드할 수 있는

항목을 만들어주고, 두 환경에서 각각 사용자가 올린 파일을 읽어올 수 있는 방법에 대하여

다루어보도록 하겠습니다.

 

 

방법 1 : ipywidgets의 FileUpload 사용

ipynb 파일 환경의 첫 번째 upload 항목 생성 방법은 ipywidgets을 활용한 방법입니다.

이 방법은 주피터 노트북, 코랩 환경 모두에서 적용이 가능합니다.

 

아래와 같은 간단한 텍스트 파일인 example.txt 파일을 업로드하는 상황을 가정해보겠습니다.

 

아래와 같이 FileUpload 함수 및 display를 이용하여 Upload 칸을 출력해줍시다.

from ipywidgets import FileUpload
from IPython.display import display

upload = FileUpload(accept='.txt')
display(upload)

생성된 Upload 항목을 클릭하여 파일을 올려주시면 Upload (1)처럼 숫자가 변경됩니다.

 

이후, 업로드된 파일 내의 정보를 확인하기 위해서 value 속성을 출력해보겠습니다.

print(upload.value)

'''{'example.txt': {'metadata': {'name': 'example.txt', 'type': 'text/plain', 
'size': 12, 'lastModified': 1649073863940}, 'content': b'12345\r\nabcde'}}'''

 

해당 정보 내에서 파일 이름 및 파일 내 텍스트 정보를 가져오는 방법은 아래와 같습니다.

list(upload.value.keys())[0] # 파일 이름 : 'example.txt'

list(upload.value.values())[0]['content'] # 파일 내 정보 : b'12345\r\nabcde'
반응형

현재 들어있는 정보는 바이트 객체 형식이므로, 문자열로 디코딩 후 파싱 과정을 통하여

각 줄의 텍스트들을 리스트 형태로 담아내도록 하겠습니다.

# 바이트 객체 -> 문자열 디코딩
byte_data = list(upload.value.values())[0]['content'] # b'12345\r\nabcde'
data = byte_data.decode('utf-8') # '12345\r\nabcde'

# 각 행마다의 텍스트 리스트로 추출
data.replace('\r', '').split('\n') # ['12345', 'abcde']

 

 

방법 2 : google.colab의 files 사용(코랩 환경에서만 가능)

파이썬 ipynb 환경에서 업로드 항목을 만드는 두 번째 방법은

google.colab의 files 패키지를 활용하는 것입니다.

 

이 방법이 사용자 입장에서도 활용이 용이하고, 파싱 과정도 간단하지만

주피터 노트북에서는 적용이 다소 어렵고 코랩 환경에서만 이용이 가능하다는 단점이 있습니다.

 

files를 이용한 경우는 아래 코드로 곧바로 Colab 내에서 파일 업로드 칸을 생성할 수 있습니다.

from google.colab import files
f = files.upload()

파일 선택 버튼 클릭 후 원하는 파일을 올려주시면 사용 준비가 완료됩니다.

 

파일 이름 및 파일 내 텍스트를 가져오는 과정은 ipywidgets를 활용한 방법과 비슷해보이지만

읽어들인 결과의 데이터 구조가 간단하여 코드가 약간 더 간결한 점을 확인할 수 있습니다.

print(f) # {'example.txt': b'12345\r\nabcde'}

print(list(f.keys())[0]) # 파일 이름 : example.txt

print(list(f.values())[0]) # 파일 내 정보 : b'12345\r\nabcde'

 

이후 디코딩 및 파싱 과정을 마찬가지로 진행해주시면 데이터 불러오기가 완료됩니다.

# 바이트 객체 -> 문자열 디코딩
byte_data = list(f.values())[0] # b'12345\r\nabcde'
data = byte_data.decode('utf-8') # '12345\r\nabcde'

# 각 행마다의 텍스트 리스트로 추출
data.replace('\r', '').split('\n') # ['12345', 'abcde']