【问题标题】:Get ftp.retrlines to print a file's content to a string获取 ftp.retrlines 以将文件的内容打印到字符串
【发布时间】:2025-12-13 00:25:01
【问题描述】:

我想用 ftplib 获取文件的内容并将其存储在 python 中的字符串变量中。我的第一次尝试如下。我猜 lambda 不能包含赋值——可能是因为 lambda 是一个函数 + 应该是自包含的变量(?)。

contents = ""
ftp.retrlines("RETR " + filename, lambda s: contents=s) #lambda cannot contain assignment

无论如何,我需要将输出捕获到标准输出还是有更简单的方法?

【问题讨论】:

  • *.com/questions/9969247/… 我想回答你关于实现的问题我认为 lambda 不起作用,因为它不是回调,但不够聪明,无法确定

标签: python lambda


【解决方案1】:
outStr = StringIO.StringIO() # Use a string like a file.
ftp.retrlines('RETR ' + fileToGet, outStr.write)
print outStr.getvalue()
outStr.close()

https://docs.python.org/2/library/stringio.html

【讨论】:

    【解决方案2】:

    首先,这失败了,因为python does not allow statements inside lambdas, only pure expressions

    其次,即使您将其作为函数执行,即:

    contents = ""
    def assign(s):
        contents=s
    ftp.retrlines("RETR " + filename, assign )
    

    它会失败,因为通过运行contents=s,您只是创建了一个局部变量,而不是引用(全局)变量contents

    您可以进一步更正它:

    contents = ""
    def assign(s):
        global contents
        contents=s
    ftp.retrlines("RETR " + filename, assign )
    

    但这(使用全局变量)通常被认为是一种不好的做法。相反,您可能应该重新考虑您的回调,以实际执行所有您需要对数据执行的操作。这并不总是那么容易。您可能希望将functools.partial 放在您的编程腰带上一个方便的地方。

    【讨论】: