【发布时间】:2011-04-02 16:28:52
【问题描述】:
我想在 Python 中下载、提取和迭代文本文件,而无需创建临时文件。
基本上是这个管道,但是在 python 中
curl ftp://ftp.theseed.org/genomes/SEED/SEED.fasta.gz | gunzip | processing step
这是我的代码:
def main():
import urllib
import gzip
# Download SEED database
print 'Downloading SEED Database'
handle = urllib.urlopen('ftp://ftp.theseed.org/genomes/SEED/SEED.fasta.gz')
with open('SEED.fasta.gz', 'wb') as out:
while True:
data = handle.read(1024)
if len(data) == 0: break
out.write(data)
# Extract SEED database
handle = gzip.open('SEED.fasta.gz')
with open('SEED.fasta', 'w') as out:
for line in handle:
out.write(line)
# Filter SEED database
pass
我不想使用 process.Popen() 或任何东西,因为我希望这个脚本独立于平台。
问题在于 Gzip 库只接受文件名作为参数而不接受句柄。 “管道”的原因是下载步骤仅占用约 5% 的 CPU,同时运行提取和处理会更快。
编辑: 这行不通,因为
"由于gzip压缩的方式 有效,GzipFile 需要保存它的 定位和前进 向后通过压缩文件。 当“文件”是 来自远程的字节流 服务器;你所能做的就是 一次检索一个字节,而不是移动 来回通过数据 流。” - dive into python
这就是我收到错误的原因
AttributeError: addinfourl instance has no attribute 'tell'
那么curl url | gunzip | whatever 是如何工作的呢?
【问题讨论】:
-
为什么不在单独的 Python 文件中?
python download.py | python extract.py | python filter.py? -
因为从 python 脚本的系统命令执行 python 脚本很麻烦。另外,我说过我希望它独立于平台(这意味着那些使用 Windows 的人不会有任何问题),并且执行系统命令会使这变得困难。 DOS 甚至支持管道吗?
标签: python