让csv.reader告诉它何时在最后一行

ʞɔı*_*ɔıu 9 python csv

显然,某些csv输出实现会在最后一行的右侧截断字段分隔符,而在字段为空时仅截断文件中的最后一行.

示例输入csv,字段'c'和'd'可以为空:

a|b|c|d
1|2||
1|2|3|4
3|4||
2|3
Run Code Online (Sandbox Code Playgroud)

在下面的脚本中,我怎么知道我是否在最后一行,所以我知道如何正确处理它?

import csv

reader = csv.reader(open('somefile.csv'), delimiter='|', quotechar=None)

header = reader.next()

for line_num, row in enumerate(reader):
    assert len(row) == len(header)
    ....
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 13

基本上你只知道在你用完之后就已经用完了.所以你可以包装reader迭代器,例如如下:

def isLast(itr):
  old = itr.next()
  for new in itr:
    yield False, old
    old = new
  yield True, old
Run Code Online (Sandbox Code Playgroud)

并将您的代码更改为:

for line_num, (is_last, row) in enumerate(isLast(reader)):
    if not is_last: assert len(row) == len(header)
Run Code Online (Sandbox Code Playgroud)

等等

  • 我很惊讶`itertools` 没有这样的东西。这是一个不断重复出现的用例。 (2认同)

Edu*_*rdo 5

我知道这是一个老问题,但我想出了一个与提出的不同的答案。当您遍历它时,该reader对象已经增加了该line_num属性。然后我首先使用 获得总行数row_count,然后将其与line_num.

import csv

def row_count(filename):
    with open(filename) as in_file:
        return sum(1 for _ in in_file)

in_filename = 'somefile.csv'
reader = csv.reader(open(in_filename), delimiter='|')

last_line_number = row_count(in_filename)
for row in reader:
    if last_line_number == reader.line_num:
        print "It is the last line: %s" % row
Run Code Online (Sandbox Code Playgroud)