将数据从谷歌云存储流式传输到FTP服务器



我正在尝试使用gcsfs和ftplib将CSV按行/块从云存储传输到FTP服务器。我在GCS中有一些大文件无法存储在内存中,所以我尝试用这种方式进行测试。

from ftplib import FTP
import gcsfs
from urllib import request
import io
ftp = FTP('my-ftp-server')
fs = gcsfs.GCSFileSystem(project='my-project')
with fs.open('myFile.csv') as f:
ftp.storlines("STOR myFile.csv", f)

但我得到了错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-56-d461792392dd> in <module>
1 with fs.open('myfile') as f:
----> 2     ftp.storlines("STOR myFile.csv", f)
~.condaenvspy3.7libftplib.py in storlines(self, cmd, fp, callback)
530         with self.transfercmd(cmd) as conn:
531             while 1:
--> 532                 buf = fp.readline(self.maxline + 1)
533                 if len(buf) > self.maxline:
534                     raise Error("got more than %d bytes" % self.maxline)
TypeError: readline() takes 1 positional argument but 2 were given

关于如何解决这个问题或实现我想要的目标,有什么建议吗?

事实上,fsspec.AbstractFileSystem(GCSFileSystem的基础(,特别是其readline方法,似乎与ftplib不兼容。


您需要使用FTP.storlines(文本模式(吗?不能使用FTP.storbinary(二进制模式(吗?

with fs.open('myFile.csv') as f:
ftp.storbinary("STOR myFile.csv", f)

FTP.storbinary按块(由默认值为8192的可选参数blocksize定义(传输文件。


如果没有,您将不得不实现一个包装类,该包装类具有与FTP.storlines:兼容的API

class GCSFileSystemCompat:
def __init__(self, f):
self.f = f
def readline(self, size):
return f.readline()
with fs.open('myFile.csv') as f,
ftp.storlines("STOR myFile.csv", GCSFileSystemCompat(f))

(未经测试,但它应该会给你这个想法(

最新更新