python - 从 FTP python 读取缓冲区中的文件

标签 python ftp stream ftplib

我正在尝试从 FTP 服务器读取文件。该文件是一个 .gz 文件。我想知道我是否可以在套接字打开时对该文件执行操作。我试图按照关于 reading files without writing to disk 的两个 StackOverflow 问题中提到的内容进行操作和 reading files from FTP without downloading但没有成功。

我知道如何提取数据/处理下载的文件,但我不确定我是否可以即时完成。有没有办法连接到该站点,在缓冲区中获取数据,可能进行一些数据提取并退出?

尝试使用 StringIO 时出现错误:

>>> from ftplib import FTP
>>> from StringIO import StringIO
>>> ftp = FTP('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/PMC-ids.csv.gz')

Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
ftp = FTP('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/PMC-ids.csv.gz')
File "C:\Python27\lib\ftplib.py", line 117, in __init__
self.connect(host)
File "C:\Python27\lib\ftplib.py", line 132, in connect
self.sock = socket.create_connection((self.host, self.port), self.timeout)
File "C:\Python27\lib\socket.py", line 553, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
gaierror: [Errno 11004] getaddrinfo failed

我只需要知道如何将数据放入某个变量并对其进行循环,直到读取来自 FTP 的文件。

感谢您的宝贵时间和帮助。谢谢!

最佳答案

请确保先登录到 ftp 服务器。在此之后,使用 retrbinary 以二进制模式提取文件。它在文件的每个 block 上使用回调。您可以使用它来将其加载到字符串中。

from ftplib import FTP
ftp = FTP('ftp.ncbi.nlm.nih.gov')
ftp.login() # Username: anonymous password: anonymous@

# Setup a cheap way to catch the data (could use StringIO too)
data = []
def handle_binary(more_data):
    data.append(more_data)

resp = ftp.retrbinary("RETR pub/pmc/PMC-ids.csv.gz", callback=handle_binary)
data = "".join(data)

加分项:我们在处理字符串时如何解压它?

简易模式,使用上面的数据串

import gzip
import StringIO
zippy = gzip.GzipFile(fileobj=StringIO.StringIO(data))
uncompressed_data = zippy.read()

稍微好一点,完整的解决方案:

from ftplib import FTP
import gzip
import StringIO

ftp = FTP('ftp.ncbi.nlm.nih.gov')
ftp.login() # Username: anonymous password: anonymous@

sio = StringIO.StringIO()
def handle_binary(more_data):
    sio.write(more_data)

resp = ftp.retrbinary("RETR pub/pmc/PMC-ids.csv.gz", callback=handle_binary)
sio.seek(0) # Go back to the start
zippy = gzip.GzipFile(fileobj=sio)

uncompressed = zippy.read()

实际上,即时解压缩会好得多,但我看不到使用内置库执行此操作的方法(至少不容易)。

关于python - 从 FTP python 读取缓冲区中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772703/

相关文章:

python 2 与 python 3 pd.merge 命令

python - 为什么我的 Flask 应用程序应该在应用程序的父目录中包含数据库和数据库存储库?

java - Java流通信中如何获取客户端的IP地址

scala - Akka 流 : What is the difference between Unzip and Broadcast?

c# - 在派生自 Stream 的类上实现 Dispose

python - 条件标记 matplotlib

python - 如何将具有两个键的字典分成两个单独的新列?

ftp - 使用 JDK 1.7 时 sun.net.ftp.FtpClient 出现错误

c# - 如何通过FTP覆盖文件

python - 如何访问 Amazon EC2 上的 pyftpdlib FTPS 服务器?