запись в файл-объект pysftp с использованием pandas to_csv со сжатием на самом деле не сжимает - PullRequest
1 голос
/ 13 июля 2020

Я просмотрел много связанных ответов здесь, в Stackoverflow, и этот вопрос кажется наиболее связанным Как перенести Pandas DataFrame в .csv по SFTP с помощью библиотеки Paramiko в Python? . Я хочу сделать что-то подобное, однако я хочу сжимать файл, когда я отправляю его в расположение SFTP, поэтому я получаю по сути файл .csv.gz. Файлы, с которыми я работаю, имеют размер 15-40 МБ без сжатия, но их иногда бывает много, поэтому нужно, чтобы отпечаток пальца оставался небольшим.

Я использовал подобный код, чтобы переместить фрейм данных в destination, после вытаскивания его из другого места как csv, выполнения некоторых преобразований в самих данных:

fileList = source_sftp.listdir('/Inbox/')   
dataList = []
for item in fileList: # for each file in the list...
    print(item)
    if item[-3:] == u'csv':
        temp = pd.read_csv(source_sftp.open('/Inbox/'+item)) # read the csv directly from the sftp server into a pd Dataframe
    elif item[-3:] == u'zip':
        temp = pd.read_csv(source_sftp.open('/Inbox/'+item),compression='zip')
    elif item[-3:] == u'.gz':
        temp = pd.read_csv(source_sftp.open('/Inbox/'+item),compression='gzip')
    else:
        temp = pd.read_csv(source_sftp.open('/Inbox/'+item),compression='infer')
    dataList.append(temp) # keep each 
#... Some transformations in here on the data 
FL = [(x.replace('.csv',''))+suffix # just swap out to suffix
      for x in fileList]
locpath = '{}/some/new/dir/'.format(dest_sftp.pwd)
i = 0     
for item in dataList:
    with dest_sftp.open(locpath + FL[i], 'w') as f:
        item.to_csv(f, index=False,compression='gzip')
    i = i+1

Кажется, я смогу заставить это работать, но я предполагаю, что что-то происходит пропускается, когда я использую to_csv для обратного преобразования фрейма данных, а затем сжимаю его в файловом объекте sftp. Должен ли я каким-то образом транслировать это, или есть решение, которое мне не хватает где-то в документации по pysftp или pandas?

Если я могу избежать сохранения файла csv где-то вначале локально, я бы хотел, но я не думаю, что я должен, правда? Я могу получить файл в конце для сжатия, если я просто сохраню файл локально с помощью temp.to_csv('/local/path/myfile.csv.gz', compression='gzip'), и после передачи этого локального файла в пункт назначения он все еще сжат, поэтому я не думаю, что это имеет отношение к передаче , просто как pandas .Dataframe.to_csv и pysftp.Connection.open используются вместе.

Я, вероятно, должен добавить, что все еще считаю себя новичком ie по большей части из Python, но я работали с local на sftp и sftp на local, и им не пришлось много делать в способах передачи (прямо или косвенно) между ними.

1 Ответ

0 голосов
/ 14 июля 2020

Убедитесь, что у вас установлена ​​последняя версия Pandas.

Он поддерживает сжатие файловым объектом только с версии 0.24: GH21227: df.to_csv игнорирует сжатие, если предоставляется дескриптор файла

...