игнорировать пустую (незаполненную) строку с помощью python csv reader

все.

Я не могу найти питонический способ игнорировать «пустые» строки в CSV. Я использую кавычки, потому что я говорю о строках, которые выглядят как '','','','','' Вот CSV (пустые строки могут быть случайными):

id,name,age
1,alex,22
3,tiff,42
,,
,,
4,john,24

Вот код:

def getDataFromCsv(path):
    dataSet = []
    with open(unicode(path), 'r') as stream:
        reader = csv.reader(stream, delimiter=',')
        reader.next() # ignoring header
        for rowdata in reader:
            # how to check here?
            dataSet.append(rowdata)
    return dataSet

Вот похожие вопросы, которые я читал, но, в частности, отличаются от этого: python csv читатель игнорирует пустую строку


person alete    schedule 16.01.2018    source источник
comment
Вы можете использовать if any(x for x in rowdata): dataSet.append(rowdata)   -  person dekim    schedule 17.01.2018
comment
Кстати, измените на next(reader), чтобы также быть совместимым с Python3   -  person tonypdmtr    schedule 17.01.2018
comment
вместе с решением schwobaseggl @dekim работает именно так, как и ожидалось. Спасибо   -  person alete    schedule 17.01.2018
comment
@tonypdmtr хороший звонок, я думал только о 2.7.x, но пока буду иметь это в виду.   -  person alete    schedule 17.01.2018


Ответы (5)


Вы можете использовать any, чтобы проверить, содержит ли какой-либо столбец в строке данные:

for rowdata in reader:
    # how to check here?
    if any(x.strip() for x in rowdata):
        dataSet.append(rowdata)
person schwobaseggl    schedule 16.01.2018
comment
Работает, как и ожидалось, понятно и кое-чему меня научило. Спасибо! - person alete; 17.01.2018
comment
Полезный! Если я правильно понимаю, эта строка if any(x.strip() for x in rowdata): может быть прочитана так: если после удаления всех строковых значений в строке остались какие-либо значения, то в строке есть данные, и их следует добавить в dataSet' - person user7587050; 25.02.2020
comment
Для тех, кто пытается удалить пустые строки из строк, вы использовали csv.DictReader: не забудьте указать, что x - это список значений из вашего словаря строк, т.е. используйте эту строку: if any(x.strip() for x in list(row.values())): - person user7587050; 25.02.2020
comment
@grego если после удаления всех строковых значений в строке остались какие-либо значения -- это почти правильно: 1. ... остались любые значения, которые не являются пустой строкой ... 2. any останавливается на первом истинном элементе, т.е. не обязательно все элементы удаляются, а столько, сколько требуется. - person schwobaseggl; 25.02.2020

Опасная зона.. Может возродить старую тему..

Почему бы не использовать фильтр? Тогда, я думаю, нет проблем с памятью для больших CSV-файлов.

Что-то типа:

for data in filter(any, reader):
    print(data)
person vt220    schedule 21.06.2021

Как насчет:

if len(rowdata) > 0:
    dataSet.append(rowdata)

Или я пропустил часть вашего вопроса?

person Patrick O'Connor    schedule 16.01.2018
comment
Это не сработает, так как эти пустые строки по-прежнему имеют длину 3. Вы должны проверить, все ли 3 строки в строке пусты. - person schwobaseggl; 17.01.2018

Вы можете использовать встроенную функцию any:

for rowdata in reader:
    # how to check here?
    if not any(row):
        continue
    dataSet.append(rowdata)
person tommy.carstensen    schedule 19.03.2019

with open(fn, 'r') as csvfile:
    reader = csv.reader(csvfile)
    data = [row for row in reader if any(col for col in row)]
  • открыть CSV-файл
  • создать объект csv.reader()
  • use a list comprehension to:
    • iterate over CSV rows
    • перебирать столбцы в строке
    • проверьте, имеет ли какой-либо столбец в строке значение, и если да, добавьте в список
person TLK3    schedule 27.03.2019
comment
Привет, добро пожаловать в Stack Overflow. Отвечая на вопрос, на который уже есть много ответов, не забудьте добавить дополнительную информацию о том, почему ваш ответ является существенным, а не просто повторяет то, что уже проверено исходным автором. Это особенно важно в ответах только на код, таких как тот, который вы предоставили. - person chb; 27.03.2019
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person DebanjanB; 28.03.2019