Is it possible to read FTP files without writing them using Python?

前端 未结 1 396
日久生厌
日久生厌 2020-12-05 04:51

I am trying to read files using Python\'s ftplib without writing them. Something roughly equivalent to:

def get_page(url):
    try:
        return urllib.url         


        
相关标签:
1条回答
  • 2020-12-05 04:58

    Well, you have the answer right in front of you: The retrbinary method accepts as second parameter a reference to a function that is called whenever file content is retrieved from the ftp connection.

    Here is a simple example:

    #!/usr/bin/env python
    from ftplib import FTP
    
    def writeFunc(s):
      print "Read: " + s
    
    ftp = FTP('ftp.kernel.org') 
    ftp.login()
    ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', writeFunc)
    

    You should implement writeFunc so that it actually appends the data read to an internal variable, something like this, which uses a callable object:

    #!/usr/bin/env python
    from ftplib import FTP
    
    class Reader:
      def __init__(self):
        self.data = ""
      def __call__(self,s):
         self.data += s
    
    ftp = FTP('ftp.kernel.org') 
    ftp.login()
    r = Reader()
    ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r)
    
    print r.data
    

    Update: I realized that there is a module in the Python standard library that is meant for this kind of things, StringIO:

    #!/usr/bin/env python
    from ftplib import FTP
    from io import StringIO
    
    ftp = FTP('ftp.kernel.org') 
    ftp.login()
    r = StringIO()
    ftp.retrbinary('RETR /pub/README_ABOUT_BZ2_FILES', r.write)
    
    print r.getvalue()
    

    Update 2: StringIO has been rolled into io. Incorporated @TimRichardson's comment.:

    0 讨论(0)
提交回复
热议问题