【发布时间】:2010-03-24 14:46:45
【问题描述】:
我正在读取几个文件,每个文件分为两部分,首先是几千行的标题部分,然后是几千行的正文。我的问题是我需要将这些文件连接到一个文件中,其中所有标题都在顶部,然后是正文。
目前我正在使用两个循环:一个是拉出所有标题并写入它们,第二个是写入每个文件的主体(我还包括一个 tmp_count 变量来限制要加载的行数转储到文件之前的内存)。
这非常慢 - 13gb 文件大约需要 6 分钟。谁能告诉我如何优化这一点,或者在 python 中是否有更快的方法来做到这一点?
谢谢!
这是我的代码:
def cat_files_sam(final_file_name,work_directory_master,file_count):
final_file = open(final_file_name,"w")
if len(file_count) > 1:
file_count=sort_output_files(file_count)
# only for @ headers
for bowtie_file in file_count:
#print bowtie_file
tmp_list = []
tmp_count = 0
for line in open(os.path.join(work_directory_master,bowtie_file)):
if line.startswith("@"):
if tmp_count == 1000000:
final_file.writelines(tmp_list)
tmp_list = []
tmp_count = 0
tmp_list.append(line)
tmp_count += 1
else:
final_file.writelines(tmp_list)
break
for bowtie_file in file_count:
#print bowtie_file
tmp_list = []
tmp_count = 0
for line in open(os.path.join(work_directory_master,bowtie_file)):
if line.startswith("@"):
continue
if tmp_count == 1000000:
final_file.writelines(tmp_list)
tmp_list = []
tmp_count = 0
tmp_list.append(line)
tmp_count += 1
final_file.writelines(tmp_list)
final_file.close()
【问题讨论】:
-
请修正你的代码块的格式;不可读
-
文件的格式是什么?你如何确定标题和正文之间的边界?
-
您的代码格式仍然错误。
if line.startswith("@"):之后出现语法错误。 -
可以帮助您的一点是,@header 之后的所有剩余部分都是@body,这表明您不需要逐行阅读此部分,但可以复制它作为一个整体。另外,我不确定 1M 行是否是 IO 写入和内存之间的适当平衡,因此您也可以尝试一下。
-
嗨,我很抱歉格式不正确,但在文本框中所有内容都正确缩进,我已尝试重置标签 - 可能是我的浏览器有问题。将尝试尽快修复它。感谢大家的回复!
标签: python file concatenation