【问题标题】:For loop in try except to skip NULL byte尝试中的 for 循环,除了跳过 NULL 字节
【发布时间】:2016-06-12 17:25:09
【问题描述】:

我也遇到了一个问题,我也找不到干净的解决方案。我正在读取 csv 文件(每行约 4000 行,最多约 2000 个文件),其中一些在文件中随机包含一个 NULL 字节(它们最初不应该存在)。他们在自己的一排,我正试图找到一种方法来跳过他们。我觉得最干净的方法是将 for 循环放在 try except 中,当它遇到 NULL 字节时,它将跳到 for 循环的下一次迭代。我的问题是如果 for 循环失败,continue 会移动到循环的下一次迭代吗?我假设它不会,但我不知道如何轻松测试它,我想不出另一种方法来做到这一点。

这里有一些伪代码

reader = csv.reader(open('file'))
while 1:
    try:
        for row in reader:
            #do stuff with row
        break
    except:
        continue

【问题讨论】:

  • 也许你可以用一个小数据集进行测试,看看行为是否符合你的预期?也许为此设置一个单元测试以查看您的方法在不同输入下的行为?
  • @idjaw 会继续 for 循环还是 while 循环?
  • 如果您想从文件中删除空字节,为什么要使用 csv?为什么不直接infile = open("input.csv"); outfile = open("output.csv", "w"); outfile.write(infile.read().replace("\0", ""))
  • @Kevin 这不是我想要做的,但我想我可以修改它来工作。我会告诉你它是否有效
  • 为什么要将for循环放在try except中,而不是将try except放在for循环中?

标签: python csv null try-except


【解决方案1】:

如果您想更轻松地测试问题所在,则需要隔离有问题的线路。尝试计算行数,直到遇到异常:

reader = csv.reader(open('file'))
parsed_lines = 0
try:
    for row in reader:
        #do stuff with row
        parsed_lines += 1
except:
    print("I had an error on line " + str(parsed_lines))

当您可以轻松测试问题所在时,您可能会更轻松地找到解决方案。

【讨论】:

  • 我知道问题出在哪里,只是不知道如何处理
  • 也许最好给我们一些有问题的行,这样我们就可以全力帮助了。
【解决方案2】:

如果空字符在它自己的行上,你应该能够在列表理解中跳过它。这会搜索 None 但可以轻松调整为搜索“”或“Null”

csv_as_list = [row for row in csv_file if row is not "\0"]

for row in reader:
    try:
        # do stuff with row
    except:
       continue

【讨论】:

  • 我认为 None 和 NULL 字节是不同的东西。
  • 我真的不想循环整个文件两次,这是我必须用这个解决方案做的
  • 根据您需要做的所有事情,您可以将逻辑包含在列表理解中,创建一个部分,或者只使用一个常规的 for 循环。此外,如果遇到异常,它似乎不会评估任何内容。我调整了我的答案,使其与你所拥有的一致。
猜你喜欢
  • 2018-02-28
  • 2012-05-23
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多