2016-06-20 1 views
0

Я пытаюсь извлечь файлы из Интернета, сохранить их как данные (без сохранения файлов на компьютере), выполнить расчет, сохранить результирующие данные в требуемом формат как файлы csv, zip их и отправить их в исходный источник (см. ниже мой код). Это работает отлично, но поскольку я должен отправить сотни файлов и задавался вопросом, есть ли способ , сохраняющий данные в файле csv, а затем застегивая его на ходу (т. Е. Без сохранения его на компьютере)? Ниже мой код;Отправка нескольких файлов .CSV после их замены и без сохранения на диск

file_names=['A','B','C'] 
hdll_url = 'http://XYZ' 
saving_folder_url = 'C:\Users\Desktop\Testing_Folder' 

general = [] 
for i in file_names: 
    url = ('http://') 
    data1 = requests.get(url) 
    Z1 = zipfile.ZipFile(StringIO.StringIO(data1.content)) 
    x=pd.read_csv(Z1.open('%s.tsv'%i), sep = '\t', names=["Datetime","Power"]) 
    x['Datetime'] = pd.to_datetime(x['Datetime']) 
    x = x.set_index("Datetime") 
    x = x.resample('H', how= 'sum') 
    general.append(x) 

ABC = pd.DataFrame(general[0]['Power'] + general[1]['Power'] + general[3]['Power'] * 11.363) 
ABC.to_csv('%s\ABC.tsv'%saving_folder_url, 
        sep='\t',header=False,date_format='%Y-%m-%dT%H:%M:%S.%f') 
ABC_z1 = zipfile.ZipFile('%s\ABC.zip'%saving_folder_url,mode='w') 
ABC_z1.write("%s\ABC.tsv"%saving_folder_url) 
ABC_z1.close() 

ABC_files1 = {'file': open("%s\ABC.zip"%saving_folder_url,'rb')} 
ABC_r1 = requests.put(hdll_url, files=ABC_files1, headers = {'content-type':'application/zip', 
         'Content-Disposition': 'attachment;filename=ABC.zip' 
            }) 

XYZ = pd.DataFrame(general[0]['Power'] + general[1]['Power']*100) 
XYZ.to_csv('%s\XYZ.tsv'%saving_folder_url, 
        sep='\t',header=False,date_format='%Y-%m-%dT%H:%M:%S.%f') 
XYZ_z1 = zipfile.ZipFile('%s\XYZ.zip'%saving_folder_url,mode='w') 
XYZ_z1.write("%s\XYZ.tsv"%saving_folder_url) 
XYZ_z1.close() 

XYZ_files1 = {'file': open("%s\XYZ.zip"%saving_folder_url,'rb')} 
XYZ_r1 = requests.put(hdll_url, files=XYZ_files1, headers = {'content-type':'application/zip', 
         'Content-Disposition': 'attachment;filename=XYZ.zip' 
            }) 

P.S: Мне разрешено отправлять файлы только в формате .zip.

ответ

0

Посмотрите BytesIO():

memory_file = BytesIO() 
with zipfile.ZipFile(memory_file, 'w') as zf: 
    zi = zipfile.ZipInfo('your_filename.txt') 
    zi.date_time = time.localtime(time.time())[:6] 
    zi.compress_type = zipfile.ZIP_DEFLATED 
    zf.writestr(zi, 'your file content goes here') 

memory_file.seek(0) 

Затем передать его методу пут:

requests.put(<your_url>, data=memory_file, header=<your_headers>) 

Или что-то вдоль линий этого. Я не тестировал код, но первая часть взята из флеш-приложения, в котором используется send_file(), чтобы передать файл клиенту.

+0

спасибо, но с этим методом я все еще буду сохранять файлы в виде файлов csv/.txt перед их сжатием? – Muhammad

+0

Ничего не будет записано на ваш жесткий диск. Объект BytesIO живет в памяти. – nucleon

+0

, но откуда-то получается 'your_filename.txt', нет? – Muhammad

Смежные вопросы