【问题标题】:How to ignore blank rows in a csv file如何忽略csv文件中的空白行
【发布时间】:2012-01-15 08:58:03
【问题描述】:

我正在使用 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()):

【问题讨论】:

    标签: python file csv


    【解决方案1】:

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

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

    这有帮助吗?

    【讨论】:

    • 嗨!感谢回复!我更想要一些可以读取行的东西,如果它们有任何感兴趣的东西,但只有当它完全空白时才会忽略一行。例如,如果我有 {'1': '', '2': 'two', '3': ''} 和 {'1': '', '2': '', '3': ''}我只想保留 {'1': '', '2': 'two', '3': ''}
    【解决方案2】:

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

    【讨论】:

    • 嗨!感谢您的帮助:) 我无法查看每个字典中的每个值。我认为以上是为了将行作为列表处理?而不是字典?抱歉,我是新手。
    • 将它与 csv.reader 一起使用将为您提供列表。如果你用 csv.DictReader 做同样的事情(我以前不知道但很酷......),它会给你字典。它是文件的替代品,而不是文件的读取。
    【解决方案3】:

    您对行的迭代形成了 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)
    

    【讨论】:

    • 阅读 OP 对 mac 答案的评论......他想附加 line,而不是 cleaned_line
    • 约翰,谢谢我重新阅读了评论,“如果有任何感兴趣的内容会读取行,但只有当它完全空白时才会忽略行”。这正是它正在做的事情。如果该行为空,“cleaned_line”将为空。您可以在此处使用行列表来处理已清理的行或执行其他一些功能。
    • monkut,他想要的是if cleaned_line: lines.append(line) ...正如他所说,他想保留{'1': '', '2': 'two', '3': ''},而不是{'2': 'two'}
    • 约翰,感谢您的澄清。我明白了,这取决于他对结果线做了什么。 DictWriter 对象将愉快地接受 {'2': 'two'} 作为输入并适当地写出该行。
    • 感谢所有建议!我发现以下内容对我有用,再次感谢...如果有的话(x != '' for x in dictionary.itervalues()):
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 2014-05-08
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多