【问题标题】:Downloading a file into memory将文件下载到内存中
【发布时间】:2011-11-28 18:05:14
【问题描述】:

我正在编写一个 python 脚本,我只需要一系列非常小的文本文件的第二行。我想在不将文件保存到我的硬盘驱动器的情况下提取它,就像我目前所做的那样。

我发现了一些引用 TempFile 和 StringIO 模块的线程,但我无法理解它们。

目前我下载所有文件并按顺序命名它们,如 1.txt、2.txt 等,然后遍历所有文件并提取第二行。我想打开文件抓住行,然后继续查找并打开和读取下一个文件。

这是我目前将其写入硬盘的操作:

while (count4 <= num_files):
    file_p = [directory,str(count4),'.txt']
    file_path = ''.join(file_p)        
    cand_summary = string.strip(linecache.getline(file_path, 2))
    linkFile = open('Summary.txt', 'a')
    linkFile.write(cand_summary)
    linkFile.write("\n")
    count4 = count4 + 1
    linkFile.close()

【问题讨论】:

  • 我对您用来学习 Python 的教程/书籍非常感兴趣,因此我可以向您推荐其他的。

标签: python temporary-files stringio


【解决方案1】:

只需将文件写入替换为对列表中append() 的调用即可。例如:

summary = []
while (count4 <= num_files):
    file_p = [directory,str(count4),'.txt']
    file_path = ''.join(file_p)        
    cand_summary = string.strip(linecache.getline(file_path, 2))
    summary.append(cand_summary)
    count4 = count4 + 1

顺便说一句,您通常会写count += 1。看起来count4 使用基于 1 的索引。这对 Python 来说似乎很不寻常。

【讨论】:

  • 或者使用for count4 in range(1, num_files + 1)而不是增加自己!
  • @agf 同意,但我不能 100% 确定 count4 从 1 开始运行。
【解决方案2】:

您在每次迭代中打开和关闭输出文件。

为什么不干脆做

with open("Summary.txt", "w") as linkfile:
    while (count4 <= num_files):
        file_p = [directory,str(count4),'.txt']
        file_path = ''.join(file_p)        
        cand_summary = linecache.getline(file_path, 2).strip() # string module is deprecated
        linkFile.write(cand_summary)
        linkFile.write("\n")
        count4 = count4 + 1

另外,linecache 在这里可能不是正确的工具,因为它针对从同一个文件中读取多行进行了优化,而不是从多个文件中读取同一行。

相反,最好这样做

with open(file_path, "r") as infile:
    dummy = infile.readline()
    cand_summary = infile.readline.strip()

另外,如果您删除 strip() 方法,您不必重新添加 \n,但谁知道您为什么要在其中添加它。也许.lstrip() 会更好?

最后,手动 while 循环有什么用?为什么不使用 for 循环?

最后,在您发表评论后,我了解到您希望将结果放入列表而不是文件中。好的。

总而言之:

summary = []
for count in xrange(num_files):
    file_p = [directory,str(count),'.txt'] # or count+1, if you start at 1
    file_path = ''.join(file_p)        
    with open(file_path, "r") as infile:
        dummy = infile.readline()
        cand_summary = infile.readline().strip()
        summary.append(cand_summary)

【讨论】:

  • 我认为问题是“如何在不写入summary.txt的情况下维护内存中的摘要”
  • 我必须承认我完全不确定问题是什么。标题是关于“下载”的,但是代码里根本没有下载……
  • 下载部分在脚本的另一部分,但大卫是正确的,抱歉没有更好地解释它。有一个网站提供文件下载,我宁愿不用下载文件然后打开它然后抓住第二行,我想知道是否有更直接的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
相关资源
最近更新 更多