使用pandas to_csv和压缩写入pysftp fileobject实际上不会压缩

2024-06-16 09:23:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在这里看到了许多关于Stackoverflow的相关答案,这个问题似乎最相关。我想做一些类似的事情,但是,当我将文件发送到SFTP位置时,我想压缩该文件,因此我最终得到一个.csv.gz文件。我正在处理的文件是15-40MB大小的未压缩文件,但有时会有很多,所以需要保持指纹的小

我一直在使用这样的代码将数据帧移动到目标位置,在将其作为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

看起来我应该能够让它工作,但我猜当我使用csv将数据帧转换回来,然后在sftp文件对象上压缩它时,会跳过一些内容。我应该以某种方式将其流式传输,还是在PySTFP或pandas的文档中缺少解决方案

如果我可以避免先将csv文件保存在本地某个地方,我会这样做,但我认为我不应该这样做,对吗?如果我用temp.to_csv('/local/path/myfile.csv.gz', compression='gzip')将文件保存到本地,并且在将本地文件传输到目标后,它仍然被压缩,那么我认为这与传输无关,只是pandas.Dataframe.to_csv和pysftp.Connection.open如何一起使用

我或许应该补充一下,我仍然认为自己是一个新手,对Python有很大的兴趣,但我一直在与本地SFTP和SFTP进行本地合作,并且在传递(直接或间接)它们之间没有太大的作用。p>


Tags: 文件csvthetoinsourceforread