- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我编写了以下代码来在文本文件中定义 4 行的 block ,如果 block 的第 2 行仅由一种字符组成,则输出该 block 。假设(并且之前已验证)第 2 行始终由 36 个字符的字符串组成。
# filter out homogeneous reads
import sys
import collections
from collections import Counter
filename1 = sys.argv[1] # file to process
with open(filename1,'r') as input_file:
for line1 in input_file:
line2, line3, line4 = [next(input_file) for line in xrange(3)]
c = Counter(line2).values() # count characters in line2
c.sort(reverse=True) # sort values in descending order
if c[0] < 36:
print line1 + line2 + line3 + line4.rstrip()
但是,我收到如下 StopIteration 错误。如果有人能告诉我原因,我将不胜感激。
$ python code.py test.file > testout.file
Traceback (most recent call last):
File "code.py", line 11, in <module>
line2, line3, line4 = [next(input_file) for line in xrange(3)]
StopIteration
我们将不胜感激任何帮助,尤其是那些解释我的特定代码有什么问题以及如何修复它的帮助。这是一个输入示例:
@1:1:1323:1032:Y
AGCAGCATTGTACAGGGCTATCATGGAATTCTCGGG
+1:1:1323:1032:Y
HHHBHHBHBHGBGGGH8HHHGGGGFHBHHHHBHHHH
@1:1:1610:1033:Y
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+1:1:1610:1033:Y
HHEHHHHHHHHHHHBGGD>GGD@G8GGGGDHBHH4C
@1:1:1679:1032:Y
CGGTGGATCACTCGGCTCGTGCGTCGATGAAGAACG
最佳答案
您的示例输入已经显示了问题:那里有 10 行,不能被 4 整除。所以当您阅读最后一个 block 时,您会得到 line1
和 line2
但对于 line3
的 next()
调用,输入已用完,您什么也得不到。
您的完整输入文件中可能也有同样的问题:行数根本不能被 4 整除。
有几种方法可以克服这个问题。最好的办法可能是修复你的输入,因为你似乎一直期待四行,如果这不是输入文件提供的内容,那么似乎存在内容问题。
另一个非常简单的修复方法是使用 next()
指定一个默认值:
line2, line3, line4 = [next(input_file, '') for line in xrange(3)]
现在,当 next()
失败时,将返回默认值 ''
。因此,即使文件已用完,您仍然可以获得一些内容。
然而,一个可能更好的解决方案是修复您迭代文件的方式。您有两个位置可以访问同一个文件迭代器,一次在外部 for 循环中,三次在列表理解中。它可能看起来很简单,因此您不会遇到其他问题,但是您真的应该尝试更改它,以便您只有一个位置可以遍历迭代器;或者只使用 next()
调用,但将它与 for 循环混合似乎不是个好主意。
例如,您可以使用 grouper
itertools
recipe以四人为一组干净地迭代文件:
with open(filename1, 'r') as input_file:
for line1, line2, line3, line4 in grouper(input_file, 4, fillvalue=''):
# do things with the lines
关于python - 定义 xrange 后的 StopIteration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34434135/
我正在编写从 azure DevOps 下载大型审计日志 csv 文件并根据给定条件过滤数据的脚本。这适用于小 csv 文件,但对于具有大数据的文件,它会失败 字段 = 下一个(读者) 停止迭代 有人
这是我的代码 class A: pass def f(): yield A() def g(): it = f() next(it).a = next(it, None
以下是 Jean 对我的问题的回答:Python converting strings in a list to numbers ,运行下面的最小代码时出现 StopIteration 异常。 pri
我正在 Python 中实现一个迭代器,它包装另一个迭代器,并在传递迭代器的输出之前对其输出进行后处理。下面是一个简单的示例,它采用一个返回字符串的迭代器,并在每个字符串前面添加 FILTERED B
看看这个,问题的症结在最下面: >>> scan = iter('FHUR203459') >>> while True: print(next(scan)) F H U R 2 0
我想编写一个生成器,它可以接受来自产量的有限数量的输入,然后优雅地处理更多输入。捕获 StopIteration 的最佳方法是什么? 我尝试使用内部生成器与外部生成器进行包装,使用 try- exce
为什么这段代码抛出“StopIteration”: stub_generator = (x for x in range(5)) stub_dict = {} stub_dict[next(stub_
我有一个生成器,我想确认它已经结束(在程序的某个点。我在 python 2.7 中使用 unittest # it is a generator whould have only one item i
为什么多次调用耗尽的生成器时,StopIteration 每次都会引发,而不是仅在第一次尝试时引发?后续调用不是没有意义,并表明调用方代码中可能存在错误吗? def gen_func(): y
当迭代器耗尽时,最后一次从迭代器返回某些东西的好方法是什么。我正在使用一个标志,但这相当丑陋: class Example(): def __iter__(self): sel
我想从一个 csv 文件中读取最多 20 行: rows = [csvreader.next() for i in range(20)] 如果文件有 20 行或更多行则工作正常,否则会失败并出现 St
灵感来自 my own answer ,我什至不明白它是如何工作的,请考虑以下内容: def has22(nums): it = iter(nums) return any(x ==
我有一个 generator检查列表中某个条件的对象。这个程序适用于我的所有情况。 但我只想澄清一些关键点。 在我的程序中每当generator yield值 'No'或 'Done'控制迭代停止并调
我需要捕获 next(it) 抛出的异常,因此在这种情况下我无法使用常规的 for 循环。所以我写了这段代码: it = iter(xrange(5)) while True: try:
我的作业代码遇到了一些问题,我应该浏览一个文本文件并找到四月份的生日并打印它们。文本文件如下所示: 鲍勃,6 月 10 日 乔,4 月 12 日 苏,7 月 22 日 我应该检查一下并打印出四月份的姓
我正在使用 yield from,但我不知道 while 对 yield 的影响。如果我将 yield from 放入 while 循环中,效果很好,但是当我同时取消循环时,会发生异常。 final_
我想遍历两个不同大小的列表,但速度不同(我只找到了并行迭代的答案)。例如,考虑两个包含相同类型元素的排序列表,我想根据它们只在一个列表或两个列表中的事实对元素执行某些操作,使用两个列表的公共(publ
我正在编写一个从文件接收输入的程序,每一行都可能包含“ATG”或“GTG”,我很确定我所做的一切都是我想做的。这是我第一次在 python 中使用生成器,在研究了这个问题之后,我仍然不知道为什么我会停
我有一个函数可以使用生成器计算毕达哥拉斯三元组。但是,当我调用 next(myfunc()) 时,它会抛出此错误: Traceback (most recent call last): File
如果我有多个可迭代对象作为参数,有没有办法让代码在列表之一引发 StopIteration 之后继续运行? 我不能使用任何切片、len() 或任何 itertools。 这是我迄今为止尝试过的方法,我
我是一名优秀的程序员,十分优秀!