Я просмотрел много связанных ответов здесь, в 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, и им не пришлось много делать в способах передачи (прямо или косвенно) между ними.