在特定点将大文件拆分为较小的文件

  • 本文关键字:文件 拆分 python-3.x
  • 更新时间 :
  • 英文 :


我知道这个问题已经被问过好几次了。但是这些解决方案在这里真的对我没有帮助。我有一个非常大的文件(几乎5GB(要读取,获取数据并将其提供给我的神经网络。我必须一行一行地阅读。起初,我使用 .readlines(( 函数将整个文件加载到内存中,但这显然导致了内存不足问题。接下来,我没有将整个文件加载到内存中,而是逐行读取它,但它仍然不起作用。所以现在我正在考虑将我的文件拆分为较小的文件,然后读取每个文件。对于每个序列,我都有一个以">"开头的标头,后跟一个序列的文件格式,例如:

>seq1
acgtccgttagggtjhtttttttttt
tttsggggggtattttttttt
>seq2
accggattttttstttttttttaasftttttttt
stttttttttttttttttttttttsttattattat
tttttttttttttttt
>seq3
aa
.
.
.
>seqN
bbbbaatatattatatatatattatatat
tatatattatatatattatatatattatat
tatattatatattatatatattatatatatta
tatatatatattatatatatatatattatatat
tatatatattatatattatattatatatattata
tatatattatatattatatatattatatatatta

所以现在我想将具有 12700000 个序列的文件拆分为较小的文件,以便对于每个带有标题">"的文件,它也有正确的相应序列。如何在 python 中实现这一点而不会遇到内存问题。见解将不胜感激。

我能够使用 12,700,000 个随机行来做到这一点,每行有 1-20 个随机字符。虽然我的文件大小远小于5GB(大约300MB(——可能是由于格式的原因。综上所述,您可以尝试以下操作:

x = 0
y = 1
string = ""
cycle = "Seq1"
with open(f"{FILEPATH}/main.txt", "r") as file:
for line in file:
if line[0] == ">":
if x % 5000 == 0 and x != 0:
with open(f"{FILEPATH}/Sequence Files/Starting{cycle}.txt", "a") as newfile:
newfile.writelines(string)
cycle = f"Seq{y*5000+1}"
y += 1
string = ""
string += line
x += 1
if line[0] != ">":
string += line
with open(f"{FILEPATH}/Sequence Files/Starting{cycle}.txt", "a") as newfile:
newfile.writelines(string)

这将逐行读取文件,将前 5000 个值附加到字符串,将字符串写入新文件,并对原始文件的其余部分重复此操作。它还将使用文件中的第一个序列命名文件。

读取if x % 5000 == 0:的行是定义每个文件中序列数的行,cycle = "Seq" + str(y*5000+1)为下一个文件名创建格式的行。如果您改变主意每个文件有多少个序列(您以这种方式创建 2,540 个新文件(,则可以调整其中的 5000

最新更新