我是Python的新手,我正在尝试将一个文本文件(其中条目由两行组成)拆分为最多400个对象。
我正在处理的数据是FASTA格式的数千个序列(带有标题的纯文本,用于生物信息学),其中条目如下所示:
PIPPPASHFHPHHQNPSAATQPLCAAMAPAAKKPPLKSSSSHNSAAGDAA
MVKftaelrgimdkknirnmsviahvd
...
在Biopython中,有一个解析器SeqIO。parse允许将它们作为由id和字符串组成的对象数组进行访问,我需要在代码的后面部分使用它,并且由于我需要节省内存,所以我希望避免读取/解析源文件的次数过多。
在Biopython手册中,有一种推荐的方法可以通过生成器来实现这一点,我正在使用:https://biopython.org/wiki/Split_large_file
然而,我使用的是Python3.7,而代码在Python2中。x、 所以肯定有一些必要的改变。我改变了主意
entry=迭代器。下一个()
成
entry=next(迭代器)
但我不确定这是否就是我需要改变的全部。
代码如下:
def batch_iterator(iterator, batch_size=400):
"""Returns lists of length batch_size."""
entry = True # Make sure we loop once
while entry:
batch = []
while len(batch) < batch_size:
try:
entry = next(iterator)
except StopIteration:
entry = None
if entry is None:
# End of file
break
batch.append(entry)
if batch:
yield batch
while True:
bsequence = input("Please enter the full path to your FASTA file(e.g. c:\\folder1\\folder2\\protein.fasta):\n")
try:
fastafile = open(bsequence)
break
except:
print("File not found!\n")
record_iter = SeqIO.parse(fastafile,"fasta")
num = 0
for line in fastafile:
if line.startswith(">"):
num += 1
print("num=%i" % (num,))
if num > 400:
print("The specified file contains %i sequences. It's recommended to split the FASTA file into batches of max. 400 sequences.\n" % (num,))
while True:
decision = input("Do you wish to create batch files? (Original file will not be overwritten)\n(Y/N):")
if (decision == 'Y' or 'y'):
for i, batch in enumerate(batch_iterator(record_iter, 400), 1):
filename = "group_%i.fasta" % (i + 1)
with open(filename, "w") as handle:
count = SeqIO.write(batch, handle, "fasta")
print("Wrote %i records to %s" % (count, filename))
break
elif (decision == 'N' or 'n'):
break
else:
print('Invalid input\n')
...next part of the code
当我运行这个程序时,在Y/N提示符之后,即使我键入Y,程序也会跳过代码的下一部分,而不创建任何新文件。调试器显示以下内容:
Do you wish to create batch files? (Original file will not be overwritten)
(Y/N):Y
Traceback (most recent call last):
File "\Biopython\mainscript.py", line 32, in batch_iterator
entry = next(iterator)
StopIteration
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Program Files (x86)\Thonny\lib\site-packages\thonny\backend.py", line 1569, in _trace
return self._trace_and_catch(frame, event, arg)
File "C:\Program Files (x86)\Thonny\lib\site-packages\thonny\backend.py", line 1611, in _trace_and_catch
frame.f_back, event, marker_function_args, node
File "C:\Program Files (x86)\Thonny\lib\site-packages\thonny\backend.py", line 1656, in _handle_progress_event
self._save_current_state(frame, event, args, node)
File "C:\Program Files (x86)\Thonny\lib\site-packages\thonny\backend.py", line 1738, in _save_current_state
exception_info = self._export_exception_info()
File "C:\Program Files (x86)\Thonny\lib\site-packages\thonny\backend.py", line 1371, in _export_exception_info
"affected_frame_ids": exc[1]._affected_frame_ids_,
AttributeError: 'StopIteration' object has no attribute '_affected_frame_ids_'
python2之间有什么区别吗。x和3。我正在俯瞰的x?问题出在别的地方了吗?这种做法完全错误吗?提前谢谢!
我不能检查你的整个代码,因为你已经省略了它的一部分,但是我可以在这里看到两个错误的东西:
num = 0
for line in fastafile:
if line.startswith(">"):
num += 1
这些行正在耗尽您的文件对象快速文件
。完全删除这些行(并记住修复下面的缩进,删除if num
if (decision == 'Y' or 'y'):
这和你想象的不一样。将其更改为
if decision in('Y','Y'):
或if decision。lower()=='y':
。在下面的if(decision=='N'或'N'):
行中重复此模式,因此也要更改此模式。
进行更改并尝试再次运行代码。
第一个问题:在Python中,文件对象(即
open('filename.txt','r')
返回的内容)是一个生成器,这意味着它只能迭代一次。一开始这可能有点奇怪,但这就是使用发电机的全部意义所在。作为文件对象的生成器允许文件逐行循环,而不必一次加载整个文件内容-生成器只跟踪下一行。
另一方面,它们不能倒退,所以当您在快速文件
块中为行编写时,您会耗尽生成器。当您稍后尝试调用
batch_iterator(record_iter,400)
时,record_iter
中的生成器已经耗尽,这就是为什么您稍后会遇到错误-如果没有任何剩余,batch_iterator
无法解析快速序列解析。
第二个问题:对于带有布尔运算符的条件,如
if(决定=='Y'或'y'):
,Python将始终单独评估双方。所以Python实际上看到if(bool(决定=='Y')或bool('y')):
。
由于
bool('y')
的计算结果为True
(就像任何非空字符串一样),因此表达式将变为if(bool(decision='y')或True):
,这显然总是真的。
使用我建议的方法之一,将一个变量与条件中的多个值进行比较。
将输入值绑定到ng模型时,如下所示: 如何将输入文本绑定为数组?所以如果我输入,得到的模型将是。 现在我就是这样做到的: 在我的控制器里: 它工作正常,但我不认为这是最佳实践,因为我正在制作一个变量,然后硬编码目标数组。 是否可以将输入的模型设置到数组中,然后让输入在绑定到作用域之前通过函数?
基本上,我要问的是给定一个正方形2D阵列和一个有效的补丁大小(2D子阵列的大小),我将如何做到这一点。最终,我不需要以任何方式存储子阵列,我只需要找到每个子阵列的中值并将它们存储在一个一维阵列中。中值和存储到新阵列对我来说很简单,我只是不知道如何处理原始2D阵列并正确拆分它。我已经尝试了几次,但一直出现越界错误。我有一个4x4: 我需要像这样拆分它 < code>[1,2] [3,4] [2,3]
问题内容: 我有一个电子邮件数组(可以是1封电子邮件,也可以是100封电子邮件),我需要用ajax请求发送该数组(我知道该怎么做),但是我只能发送一个包含以下内容的数组不超过10封电子邮件。因此,如果原始阵列中包含20封电子邮件,我将需要将其拆分为2个阵列,每组10个。或者,如果原始数组中有15封电子邮件,那么1数组中的10封电子邮件,以及另一个数组中的5封电子邮件。我使用的是jQuery,哪种方
问题内容: 我设法根据逗号分割了CSV文件。我通过将虚拟字符串放置在有’,’的位置,然后根据虚拟字符串进行拆分来完成此操作。 但是,CSV文件包含以下内容: 因此,在有新行的地方,每行的最后一个值和第一个值合并到自己的字符串中。我该如何解决?我试图将我的虚拟字符串放置在此处,但据此将其拆分,但没有成功。 救命?! 问题答案: 我强烈建议您不要重新发明轮子:)。使用一个已经可用的库来处理CSV文件,
问题内容: 可以说我有一个数组: 我想创建一个接受数组和形状的函数,然后将数组拆分为给定形状的块 而无需 填充。因此,如有必要,通过重叠某些部分。例如: 我设法创建了以上输出。但是我不知道如何将其推广到所有数组和所有块大小。 优选地,对于3D阵列。 如果没有必要重叠,则应避免重叠。另一个例子: 接近,但要求数组和块形状兼容。 问题答案: 在scikit-image中有一个内置的功能可以做到这一点-
问题内容: 我需要将整个表从一个MySQL数据库移动到另一个数据库。我没有完全访问第二个权限,只有phpMyAdmin访问权限。我只能上传(压缩)小于2MB的sql文件。但是,第一个数据库表的mysqldump的压缩输出大于10MB。 有没有办法将mysqldump的输出分成较小的文件?我无法使用split(1),因为无法将文件分类(1)到远程服务器上。 还是我错过了其他解决方案? 编辑 第一个发