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