【问题标题】:Streaming data from Google Cloud Storage to an FTP Server将数据从 Google Cloud Storage 流式传输到 FTP 服务器
【发布时间】:2019-11-11 05:34:46
【问题描述】:

我正在尝试使用 gcsfsftplib 将 CSV 按行/块从 Cloud Storage 传输到 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)

~\.conda\envs\py3.7\lib\ftplib.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

关于如何解决此问题或实现我想要的任何建议?

【问题讨论】:

    标签: python ftp google-cloud-storage ftplib


    【解决方案1】:

    确实,fsspec.AbstractFileSystemGCSFileSystem 的基础),尤其是它的readline method,似乎与 ftplib 不兼容。


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

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

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


    如果没有,您将必须使用与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))
    

    (未经测试,但它应该给你的想法)

    【讨论】:

    • 这太好了,谢谢。 FTP.storbinary 使用 read() 方法,我试图避免一次读取整个文件。但是,如果我的理解有误,请纠正我?我将其设置为云功能,因此需要注意记忆。
    • 如果您认为像 ftplib 这样的主流 FTP 库会被如此糟糕地实现,那么您的期望值就会很低。 – FTP.storbinary调用fp.read(blocksize)blocksize是方法的可选参数,默认值低至8192。
    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2012-10-02
    • 2018-04-04
    • 2020-02-23
    • 2021-11-05
    相关资源
    最近更新 更多