python - 忽略停止迭代

标签 python csv error-handling stopiteration

我刚刚阅读了很多关于如何处理 Python 中的 StopIteration 错误的文章,但我在解决我的特定示例时遇到了问题。基本上,我有一个带有很多前缀的 csv 文件。该文件有两列标题:Word 和 Count。计数是该前缀出现的频率。我还有另一个包含公司名称列表的文件。前缀文件从公司文件中每个公司名称的第一个单词中获取前缀。我正在尝试删除重复项,我现在想做的是:

每次发生此错误时都忽略 StopIteration 错误。

换句话说,不必在下面写下所有注释掉的“if”语句,我只想要一行内容:如果生成 StopIteration 错误,只需通过处理有问题的“前缀”来忽略该错误"就好像它是在前缀文件中出现两次以上的前缀,这样我们应该返回不包含前缀的公司名称的值。我意识到这忽略了前缀文件中存在不同前缀值和公司名称的实际前缀这一事实,但通常它与 python 和 excel 之间存储不同的非美国英文字母有关,以及其他一些方法似乎不是特别系统,所以我稍后会手动删除它们。

我的代码是:

def remove_prefix(prefix, first_name):
   #try:
   #EXCEPTIONS:
   #if '(' in prefix:
   #    prefix = prefix[1:]
      #if ')' in prefix:
    #  prefix = prefix[:-1]
    """
      if prefix == "2-10":
        prefix = "2"
      if prefix == "4:2:2":
        prefix = "4"
      if prefix == "5/0" or prefix == "5/7" or prefix == "58921-":
        prefix = "5"
    """
    #except StopIteration:
   #    pass

   print(first_name, prefix)
   input_fields = ('Word', 'Count')
   reader = csv.DictReader(infile1, fieldnames = input_fields)
   #if the prefix has a frequency of x >=2 in the prefix file, then return first_name  without prefix
   #else, return first_Name
   infile1.seek(0)
   #print(infile1.seek(0))
   next(reader)
   first_row = next(reader)
   while prefix != first_row['Word'] and prefix[1:]!= first_row['Word']:
      first_row = next(reader)
      #print(first_name, prefix)
      #print(first_row, first_name, prefix, '\t' + first_row['Word'], prefix[1:])
   if first_row['Count'] >= 2:
      length = len(prefix)
      first_name = first_name[length+1:]
  #print("first name is ", first_name)
  return first_name

最佳答案

我不认为这是由你认为的原因造成的。 StopIteration 异常是在生成器(reader)用完要读取的行时引起的。

例如:

def g():
    "generates 1 (once)"
    yield 1

a = g()
next(a) # is 1
next(a) # StopIteration exception (nothing left to yield)

要解决此问题,您可以尝试将 next 包装起来,除了(通过):

while prefix != first_row['Word'] and prefix[1:]!= first_row['Word']:
    try:
        first_row = next(reader)
    except StopIteration:
        pass

但是,正如 David 指出的那样,这可能不是您应该采用的方式。

关于python - 忽略停止迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12221443/

相关文章:

ruby-on-rails - rails : Returning errors from Module to Rake task?

python - 仅对齐并保存结构段

python - 使用 python、vtk 和 py2exe 构建可执行文件

csv - 按列连接两行标题

java - 如何忽略展开字段 (CSV) 的特定子字段

php - 在Laravel中使用CURL获取数据时尝试获取非对象的属性 'data'

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

python - ipython 笔记本 --pylab 内联 : zooming of a plot

python - 从 excel 文件列中读取列表列表并将其存储在 python 列表中

python - pandas.read_csv()时如何抑制科学记数法?