如何忽略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
你正在通过字典读取器逐行遍历数据,然后只“使用”那些有值的行。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()
或者其他什么东西,具体取决于你的代码是如何使用这个文件对象的。)