Как игнорировать пустые строки в CSV-файле - PullRequest
4 голосов
/ 08 декабря 2011

Я использую dictreader, чтобы открыть некоторые файлы csv, добавив их в один большой список словарей, а затем использую dictwriter, чтобы записать список словарей в один файл csv.

Проблема, с которой я столкнулсяИмеется в том, что результирующий файл CSV имеет кучу пустых строк между строками с данными.Я предполагаю, что при чтении CSV-файлов он не игнорирует пустые строки.

Может кто-нибудь отправить мне правильное направление, чтобы узнать, как я говорю, чтобы игнорировать пустые строки?

I 'Я пытался найти это в модуле csv, но без радости.

Любая помощь будет высоко ценится, пожалуйста.

Привет!Спасибо за ответ!Я больше хочу, чтобы dictreader читал строки, если в них есть что-то интересное, но будет игнорировать строку, только если она полностью пуста.Например, если бы у меня было

{'1': '', '2': 'two', '3': ''},
{'1': '', '2': '', '3': ''}

, я бы просто хотел оставить

{'1': '', '2': 'two', '3': ''} 

Я обнаружил, что следующее работает для меня

for dictionary in csv.DictReader(open(filename)):
    if any(x != '' for x in dictionary.itervalues()):

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Вы можете прочитать поддельный объект файла, который пропускает пустые строки в реальном файле. Я не совсем точно знаю, что вы делаете, но это сработает лучше, чем ответ Mac, если из-за пустых строк происходит сбой процесса чтения, или вы действительно не хотите, чтобы эти пустые строки когда-либо появлялись там.

class BlankLineSkipper(object):
    def __init__(self, file):
        self.file = file
    def __iter__(self):
        return (line for line in self.file if line.strip())
    def read(self):
        return ''.join(self)

>>> print open('lol.csv').read()
5,7,8

1,2,3

abc,lol,haha


>>> list(csv.reader(open('lol.csv')))
[['5', '7', '8'], [], ['1', '2', '3'], [], ['abc', 'lol', 'haha'], []]

>>> list(csv.reader(BlankLineSkipper(open('lol.csv'))))
[['5', '7', '8'], ['1', '2', '3'], ['abc', 'lol', 'haha']]

(Вам может понадобиться реализовать readline() или что-то еще, чтобы ваш код работал, в зависимости от того, как он использует объект файла.)

3 голосов
/ 08 декабря 2011

Если я вас правильно понимаю, вам просто нужно отфильтровать словарь на наличие пустых строк, прежде чем выводить его в файл. Тривиальный пример начала работы:

>>> d = {'l1': 'data', 'l2': '   '}
>>> dict([(k, v) for k, v in d.iteritems() if v.strip()])
{'l1': 'data'}

Помогает ли это?

0 голосов
/ 08 декабря 2011

Итерации по строкам формируют диктарь, а затем только «используют» строки со значениями.Понимание списка Mac для проверки значений должно быть правильным методом для очистки ненужных строк, возвращая пустой словарь.Вы можете записать результирующий словарь {'2': 'two'}, используя объект dictwriter, даже если все ключи отсутствуют.

В приведенном ниже примере выполняется проверка строки dict, чтобы увидеть,ему присвоены любые значения.

column_headers = ["1", "2", "3"]
dictwriter = csv.DictWriter(open("output.csv", "wb"), fieldnames=column_headers)
for line in dictreader:
    # check if the line contains "interesting" values.
    # --> Result will be empty list if not and evaluate to False
    if [True for v in line.values() if v.strip()]: 
        # line is not EMPTY, process as desired
        dictwriter.writerow(line)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...