将文件下载到内存中
我正在写一个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中比较少见。