【问题标题】:Sending multiple .CSV files after zipping them and without saving to disk压缩后发送多个 .CSV 文件且不保存到磁盘
【发布时间】:2016-10-21 22:48:08
【问题描述】:

我正在尝试从 Internet 检索文件,将它们保存为数据框(不将文件保存在计算机上),做一些 计算,以所需格式将生成的数据帧保存为 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 格式的文件。

【问题讨论】:

    标签: python csv python-requests zipfile stringio


    【解决方案1】:

    看看 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)
    

    然后交给put方法:

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

    或者类似的东西。我没有测试代码,但第一部分取自一个烧瓶应用程序,它使用 send_file() 将文件交给客户端。

    【讨论】:

    • 谢谢,但是使用这种方法,我仍然会在压缩之前将文件保存为 csv/.txt 文件?
    • 不会将任何内容写入您的硬盘。 BytesIO 对象存在于内存中。
    • 但它正在从某个地方获取“your_filename.txt”,不是吗?
    • 是的,这只是一个例子。您必须根据上下文在脚本中替换它。顺便看看stackoverflow.com/questions/25064347/…
    • 'your_filename.txt' 是文件条目,它被添加到 zip 存档中。文件内容明确指定为“您的文件内容在此处”。
    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多