将文件下载到内存中

1 投票
2 回答
1184 浏览
提问于 2025-04-17 03:27

我正在写一个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()

2 个回答

0

你在每次循环时都打开和关闭输出文件。

为什么不简单地这样做呢:

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)
0

只需要把写文件的部分换成对列表的 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中比较少见。

撰写回答