Python 让csv.reader告诉它何时在最后一行
显然,某个csv输出实现在某个地方截断了文件中最后一行右侧的字段分隔符,当字段为空时,仅截断文件中最后一行的字段分隔符 示例输入csv,字段“c”和“d”可为空: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
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)
。但首先要循环整个文件以获得总行数。效率不高。在您第一次和第二次打开文件之间,当文件发生更改时会发生什么情况?