2016-02-29 94 views
1

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

下面是这个

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

也许你可以测试一个小数据集,看看你的行为是否是你期望的?也许为此设置一个单元测试,以了解您的方法在不同输入情况下的行为方式? – idjaw

+0

@idjaw会继续for循环或while循环吗? – SirParselot

+2

如果您试图从文件中删除空字节,为什么要使用csv?为什么不只是'infile = open(“input.csv”); outfile = open(“output.csv”,“w”); outfile.write(infile.read()。replace(“\ 0”,“”))'? – Kevin

回答

0

一些伪代码,如果空字符是在它自己行,你应该能够跳过它列表理解之内。这种搜索无,但可以很容易地调整搜索“”或“空”

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 
+0

我认为无和NULL字节是不同的东西。 – Kevin

+0

我真的不想循环遍历整个文件两次,这是我需要做的解决方案 – SirParselot

+0

根据你需要做什么,你可以包括在列表理解的逻辑,创建一个部分,或者只是使用常规的循环。此外,它看起来像不会评估任何事情,如果它遇到一个例外。我调整了我的答案,以便与您的内容保持一致。 –

0

如果你想更方便地测试什么是错的,你需要把问题隔离线。尝试,直到到达例外数行:

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)) 

当你可以轻松地测试什么是错的,你可能会更容易找到一个解决方案。

+0

我知道问题所在,我只是不知道如何处理 – SirParselot

+0

也许给我们提供一些有问题的线路可能会很好,所以我们可以提供全面的帮助。 – DainDwarf