如何忽略CSV文件中的空行

4 投票
3 回答
6469 浏览
提问于 2025-04-17 07:55

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

你正在通过字典读取器逐行遍历数据,然后只“使用”那些有值的行。mac使用列表推导的方法来检查值,这应该是清除不需要的行的正确方法,它会返回一个空字典。即使不是所有的键都存在,你也可以使用字典写入对象输出结果字典,比如{'2': 'two'}。

下面的示例会检查行字典,看它是否有任何值被赋值。

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

如果我理解得没错,你只需要在把字典内容写入文件之前,先把空行过滤掉。下面是一个简单的例子,帮助你入门:

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

这样说清楚了吗?

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()或者其他什么东西,具体取决于你的代码是如何使用这个文件对象的。)

撰写回答