如何忽略csv文件中的空行

时间:2011-12-07 20:42:16

标签: python file csv

我正在使用dictreader打开一些csv文件,将它们添加到一个大的字典列表中,然后使用dictwriter将字典列表写入一个csv文件。

我遇到的问题是生成的csv文件在包含数据的行之间有一堆空行。我想当正在读取csv文件时,它不会忽略空行。

有人可以按正确的方向发送给我,找到我怎么说忽略空行?

我试过在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 个答案:

答案 0 :(得分:4)

您可以读取跳过真实文件中空白行的伪文件对象。我不熟悉你正在做什么,但是如果空行使你的阅读过程崩溃,或者你真的不想在那里留空线,那么这比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()或其他内容才能使您的代码正常工作,具体取决于它如何使用文件对象。)

答案 1 :(得分:3)

如果我理解正确,您只需在将字典转储到文件之前过滤字典中的空白行。帮助您入门的一个简单示例:

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

这有帮助吗?

答案 2 :(得分:0)

您通过行迭代形成dictreader,然后仅“使用”具有值的行。 用于检查值的mac列表理解应该是通过返回空字典来清除不需要的行的正确方法。即使所有键都不存在,您也可以使用dictwriter对象写出结果字典{'2':'two'}。

下面的示例执行行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)