2011-12-07 46 views
3

我正在使用dictreader打开一些csv文件,将它们添加到一个大的字典列表中,然后使用dictwriter将字典列表写入一个csv文件。如何忽略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

以下工作。如果我理解正确的话,你只需在将其转储到文件之前,先过滤空白行的字典。一个简单的例子让你开始:

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

这有帮助吗?

+0

嗨!感谢回复!我更想要一些能够读取行的东西,如果它们中有任何感兴趣的东西,但只有在完全空白时才会忽略行。例如,如果我有{'1':'','2':'two','3':''}和{'1':'','2':'','3':''}我只想保留{'1':'','2':'two','3':''} –

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()或别的东西使你的代码工作,这取决于它如何使用文件对象。)

+0

嗨!感谢您的帮助:)我无法查看每本字典中的每个值。我认为以上是处理线条列表?而不是字典?对不起,我是新手。 –

+0

使用它与csv.reader会给你列表。如果你用csv.DictReader(我以前不知道但是很酷......)做同样的事情,它会给你字典。它是文件的替代品,而不是文件的读取。 – Dougal

0

通过线你迭代形成dictreader,然后只“用”有价值的线条。 mac的列表理解检查值应该是通过返回空字典清除不需要的行的正确方法。即使所有密钥都不存在,也可以使用dictwriter对象写出结果字典{'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) 
+0

阅读OP对mac的回答的评论......他想追加'line',而不是'cleaned_line' –

+0

John,感谢我重新阅读了这个评论,“如果他们有任何感兴趣的东西会读取行,但是只有在完全空白的情况下才会忽略一行“。这正是这样做的。如果该行为空,“cleaned_line”将为空。您可以使用线条列表来处理这里清理过的线条,或者在此处执行一些其他功能。 – monkut

+0

monkut,他想要的就是'如果清空线:lines.append(线)'......如他所说,他想保留'{'1':'','2':'two','3': ''}',而不是'{'2':'two'}' –