Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在特定点将大文件拆分为小文件_Python 3.x - Fatal编程技术网

Python 3.x 在特定点将大文件拆分为小文件

Python 3.x 在特定点将大文件拆分为小文件,python-3.x,Python 3.x,我知道这个问题已经被问过好几次了。但这些解决方案在这方面真的帮不了我。我有一个非常大的文件(大约5GB)要读取,获取数据并将其交给我的神经网络。我得逐行读。起初,我使用.readlines()函数将整个文件加载到内存中,但这显然导致了内存不足问题。接下来,我没有将整个文件加载到内存中,而是一行一行地读取它,但它仍然不起作用。所以现在我想把我的文件分割成更小的文件,然后读取每个文件。文件格式,对于每个序列,我都有一个以“>”开头的头,后跟一个序列,例如: >seq1 acgtccgttagg

我知道这个问题已经被问过好几次了。但这些解决方案在这方面真的帮不了我。我有一个非常大的文件(大约5GB)要读取,获取数据并将其交给我的神经网络。我得逐行读。起初,我使用.readlines()函数将整个文件加载到内存中,但这显然导致了内存不足问题。接下来,我没有将整个文件加载到内存中,而是一行一行地读取它,但它仍然不起作用。所以现在我想把我的文件分割成更小的文件,然后读取每个文件。文件格式,对于每个序列,我都有一个以“>”开头的头,后跟一个序列,例如:

>seq1
acgtccgttagggtjhtttttttttt
tttsggggggtattttttttt

>seq2
accggattttttstttttttttaasftttttttt
stttttttttttttttttttttttsttattattat
tttttttttttttttt

>seq3
aa

.
.
.

>seqN
bbbbaatatattatatatatattatatat
tatatattatatatattatatatattatat
tatattatatattatatatattatatatatta
tatatatatattatatatatatatattatatat
tatatatattatatattatattatatatattata
tatatattatatattatatatattatatatatta

所以现在我想把我有12700000个序列的文件分割成更小的文件,这样每个头为'>'的文件都有正确的对应序列。如何在python中实现这一点而不出现内存问题。非常感谢您的见解。

我能够用12700000条随机线做到这一点,每条线中有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个值附加到字符串,将字符串写入新文件,并对原始文件的其余部分重复此操作。它还将使用文件中的第一个序列命名文件


如果x%5000==0,则读取
的行是定义每个文件中的序列数的行,该行
cycle=“Seq”+str(y*5000+1)
为下一个文件名创建格式。如果您改变了对每个文件有多少个序列的想法,您可以调整其中的5000个序列(您正以这种方式创建2540个新文件)。

我可以使用12700000个随机行,每行包含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个值附加到字符串,将字符串写入新文件,并对原始文件的其余部分重复此操作。它还将使用文件中的第一个序列命名文件


如果x%5000==0,则读取
的行是定义每个文件中的序列数的行,该行
cycle=“Seq”+str(y*5000+1)
为下一个文件名创建格式。如果您改变了对每个文件有多少个序列的想法(您正以这种方式创建2540个新文件),您可以调整这些文件中的5000个序列。

有几个问题:在您的示例中,一些
文件后面有空格,而一些文件后面没有空格。文件也是这样,还是更标准化了?你在标题中说“在特定点”——你想如何限制新文件(例如,在某个字符计数之后,在这么多序列之后,等等)?我可以看到在for循环中使用while循环来实现这一点,但是可能有更聪明的方法使用模式和索引。所以它没有空间。我也编辑过。所以我认为每个文件都有5000个序列。我怎样才能做到这一点?你能解释一下你的逐行方法出了什么问题吗?也许可以发布代码?如果你做得很好,那么与阅读
n
较小的文件相比,应该没有任何区别。有几个问题:在你的例子中,一些
文件后面有空格,而一些文件后面没有空格。文件也是这样,还是更标准化了?你在标题中说“在特定点”——你想如何限制新文件(例如,在某个字符计数之后,在这么多序列之后,等等)?我可以看到在for循环中使用while循环来实现这一点,但是可能有更聪明的方法使用模式和索引。所以它没有空间。我也编辑过。所以我认为每个文件都有5000个序列。我怎样才能做到这一点?你能解释一下你的逐行方法出了什么问题吗?也许可以发布代码?如果你做得很好,那么与读取
n
较小的文件相比应该没有什么区别。我使用了你的代码。但它最终只给出了一行序列的文件,没有任何头或任何东西。我似乎不明白这是为什么。我得到的文件中有标题和相应的序列,但大多数文件只有一行序列。问题是在读取的最后一个序列或第5000个序列中。它先读取标题,然后读取第一行序列,然后将序列的每一行写入不同的文件中,从而创建只有一行序列而不是整个序列的文件。请检查缩进。我无法复制这个。它可能与输入文件的格式有关,但如果看不到它,就很难诊断。缩进是正确的。我仔细检查了一下。您建议我如何共享输入文件。它相当大。格式正是我在示例中给出的。唯一的区别是文件中没有空行。但是,基于您编写的代码,它不应该有什么区别,因为只有在遇到“>”时才递增。因此,我设法部分解决了这个问题。如果我在If语句块中添加x=1,那么我将去掉只有一行序列的文件。但每个被拆分文件的最后一个序列的问题仍然存在。所以我在一个文件中有头文件和序列的第一行,序列的其余部分是下一个文件的开头。但它最终只给出了一行序列的文件,没有任何头或任何东西。我似乎不明白这是为什么。我得到的文件中有标题和相应的序列,但没有