Пусть csv.reader скажет, когда он находится на последней строке - PullRequest
9 голосов
/ 09 июня 2009

Очевидно, что некоторые реализации вывода csv где-то усекают разделители полей справа в последней строке и только в последней строке в файле, когда поля равны нулю.

Пример ввода csv, поля 'c' и 'd' имеют значение NULL:

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

Ответы [ 7 ]

13 голосов
/ 09 июня 2009

Обычно вы знаете, что у вас кончились после у вас кончились Таким образом, вы можете обернуть итератор 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)

и т.д.

3 голосов
/ 15 мая 2017

Я знаю, что это старый вопрос, но я придумал ответ, отличный от представленных. Объект 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
2 голосов
/ 30 июля 2009

Если вы ожидаете фиксированное количество столбцов в каждой строке, тогда вы должны защищаться от:

(1) ЛЮБОЙ строка короче - например, средство записи (SQL Server / Query Analyzer IIRC) может пропустить конечные значения NULL в случайном порядке ; пользователи могут возиться с файлом с помощью текстового редактора, в том числе оставляя пустые строки.

(2) ЛЮБОЙ строка длиннее - например, запятые не указаны правильно.

Тебе не нужны какие-то хитрые трюки. Просто старомодный if-тест в цикле чтения строк:

for row in csv.reader(...):
    ncols = len(row)
    if ncols != expected_cols:
        appropriate_action()
1 голос
/ 08 апреля 2014

, если вы хотите получить именно последнюю строку, попробуйте этот код:

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
0 голосов
/ 31 мая 2012

Если вы используете for row in reader:, он просто остановит цикл после прочтения последнего элемента.

0 голосов
/ 30 июля 2009

Не могли бы вы просто поймать ошибку, когда читатель CSV читает последнюю строку в

попробовать: ... делай свои вещи здесь ... кроме: стоп-изменение

состояние?

См. Следующий код Python в stackoverflow для примера использования try: catch: Проблемы с Python CSV DictReader / Writer

0 голосов
/ 09 июня 2009

Просто расширьте строку до длины заголовка:

for line_num, row in enumerate(reader):
    while len(row) < len(header):
        row.append('')
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...