繁体   English   中英

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

[英]Have csv.reader tell when it is on the last line

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

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

a|b|c|d
1|2||
1|2|3|4
3|4||
2|3

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

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

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

def isLast(itr):
  old = itr.next()
  for new in itr:
    yield False, old
    old = new
  yield True, old

并将您的代码更改为:

for line_num, (is_last, row) in enumerate(isLast(reader)):
    if not is_last: assert len(row) == len(header)

等等

我知道这是一个老问题,但我想出的答案与提出的答案不同。 在您遍历它时, 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

如果您期望每行中有固定数量的列,那么您应该防范:

(1) 任何行更短 - 例如,编写器(SQL Server /查询分析器IIRC)可以随机省略尾随的NULL; 用户可以使用文本编辑器来调整文件,包括留空行。

(2) 任何行更长 - 例如逗号没有正确引用。

你不需要任何花哨的技巧。 在你的行读取循环中只是一个老式的if-test:

for row in csv.reader(...):
    ncols = len(row)
    if ncols != expected_cols:
        appropriate_action()

如果你想要获得完全最后一行,请尝试以下代码:

with open("\\".join([myPath,files]), 'r') as f:
    print f.readlines()[-1] #or your own manipulations

如果要继续使用行中的值,请执行以下操作:

f.readlines()[-1].split(",")[0] #this would let you get columns by their index

如果您for row in reader:使用for row in reader: ,它将for row in reader:最后一项后停止循环。

当csv读取器读取a中的最后一行时,你能不能只捕获错误

尝试:......在这里做你的东西......除了:StopIteration

条件?

有关如何使用try:catch: Python CSV DictReader / Writer问题的示例,请参阅stackoverflow上的以下python代码

只需将行扩展到标题的长度:

for line_num, row in enumerate(reader):
    while len(row) < len(header):
        row.append('')
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM