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

Python 让csv.reader告诉它何时在最后一行,python,csv,Python,Csv,显然,某个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 = reade

显然,某个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)
    ....

基本上,你只有在用完之后才知道你已经用完了。因此,您可以将
读取器
迭代器包装起来,例如:

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)

等等。

只需将行扩展到页眉的长度:

for line_num, row in enumerate(reader):
    while len(row) < len(header):
        row.append('')
    ...
对于枚举(读卡器)中的行\u num:
而len(行)
当csv读卡器读取文件中的最后一行时,您是否能够捕获错误

尝试: ... 在这里做你的事。。。 除了:停止迭代

状况


有关如何使用try:catch的示例,请参阅stackoverflow上的以下python代码:

如果您希望每行中有固定数量的列,那么您应该采取防御措施:

(1) 任何较短的行——例如,写入程序(SQL Server/Query Analyzer IIRC)可能会随机忽略尾随的空值;用户可以使用文本编辑器修改文件,包括留下空行

(2) 任何较长的行,例如逗号没有正确引用

你不需要任何花哨的把戏。只是行读取循环中的老式if测试:

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

如果您在reader:中对行使用
,它将在读取最后一项后停止循环。

如果您想准确获取最后一行,请尝试以下代码:

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

我知道这是一个老生常谈的问题,但我提出了一个不同于前面提到的答案。
读卡器
对象在您遍历属性时已经增加了该属性。然后我首先使用
行数
获得行的总数,然后将其与
行数
进行比较

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

请注意,您发布的内容不是CSV。CSV代表“逗号分隔值”-分隔符必须是逗号。大多数CSV实现允许您指定一个备用字符作为分隔符。只有接近CSV标准的RFC4180不允许。在Python中,per“分隔符和引号字符不同”-特别是分隔符不一定是逗号,因此,csv模块还用于读取“非逗号”分隔值,这种用法看起来很可笑(就像Excel中的“导出到csv”可以使用任何分隔符,具体取决于Windows区域设置)。如果这让任何人感觉更好,我想可以肯定地说,我在这里必须处理的输入不符合任何体面的标准。我同意,但此数据的来源拒绝/太不称职,无法向我发送正确格式的数据。我别无选择,只能自己处理它的怪癖。是的,你必须自己处理它的怪癖,我只是指出,在一般情况下,应该检查比“最后一行缺少尾随空字段”更多的怪癖,并且可以简单地检查它们,而无需复杂的代码——我不理解你的“但是”。当你在最后一行时,我不会告诉你,我再次读了你的问题,你是对的,这不是你要问的——你想要一种处理最后一行的方法。为什么您不能使用下面由John Machin提供的解决方案?我很惊讶
itertools
没有这样的解决方案。这是一个不断重复出现的用例。请注意,如果使用Python 3,则必须将
itr.next()
替换为
next(itr)
。但首先要循环整个文件以获得总行数。效率不高。在您第一次和第二次打开文件之间,当文件发生更改时会发生什么情况?