24 June 2020

Панда - открываем CSV c яндекс-диска

Одна из задач, которая возникла у меня - перенос с одного компа с Windows и Excel данные на виртуалку с Убунтой. Чтобы не заморачиваться с копированием файлов можно выложить CSV, полученный из Excel на яндекс-диск и открыть его в Юпитере Пандой.
Ссылка для доступа будет иметь вид примерной такой :
https://yadi.sk/d/xxYYYzzzKKKzY

Для начала экспортируем то, что надо

import pandas as pd
import requests
from io import StringIO
from urllib.parse import urlencode


Далее заводим строчки:

# адрес на api яндекса
base_url = 'https://cloud-api.yandex.net/v1/disk/public/resources/download?'

# Наша ссылка
public_key = 'https://yadi.sk/d/xxYYYzzzKKKzY' 


Далее загружаем файл:

# Получаем загрузочную ссылку
final_url = base_url + urlencode(dict(public_key=public_key))
response = requests.get(final_url)
download_url = response.json()['href']

# Загружаем файл и сохраняем его
download_response = requests.get(download_url)


Формально можно записать файл, а потом подать его панде:

with open('temp.csv', 'wb') as f:
    f.write(download_response.content)
   
df = pd.read_csv('temp.csv')


Однако в данном случае Панда вылетит с ошибкой.
Причина тут вот какая: если вы сохраняете файл в CSV формате в Excel то используете MS-DOS CSV и у вас разделитель полей - точка с запятой, а не запятая, как в обычном CSV. Файл, с разделениям точкой с запятой, "умная" Панда читать отказывается.
Поэтому надо ей подсказать разделитель. Вот так:

df = pd.read_csv('temp.csv', sep=';')


Но и это не все - русские символы кодируются в кодировке cp866.
Поэтому если нужно перенести корректно русские данные, надо перекодировать символы в другую кодировку.



Собирая это все вместе и обходясь без промежуточного файла ( он желателен при отладке ), получаем:

# Перекодируем из cp866
csv_raw = StringIO( download_response.content.decode('cp866'))

# Читаем пандой прямо из буфера, подставляя нужный разделитель
df = pd.read_csv(csv_raw,  sep=';')


Вот получившиеся данные:


Ответ был подсмотрен тут : как скачивать файлы с яндекс диска

No comments:

Post a Comment