Python,CSV,根据内容跳过行
我正在处理一些CSV文件,这些文件在表头之前有一些缓冲行,行数是不固定的,有的行里有字符串,有的没有。唯一一致的是,这些缓冲行中都有一个或多个单元格的值是空的,所以我想跳过任何包含空单元格的行。
我写了一个脚本,但它输出的是一个空文件。我猜是因为我没有进入到'else'部分,但我又担心如果把它放在一个循环里,最后会为每一行都创建一个文件……
with open(fileName, 'rb') as inf, open("out_"+fileName, 'wb') as outf:
csvreader = csv.DictReader(inf)
if '' in csvreader.fieldnames:
next(csvreader)
else:
fieldnames = ['url_source','downloaded_at'] + csvreader.fieldnames # add column names to beginning
csvwriter = csv.DictWriter(outf, fieldnames)
csvwriter.writeheader()
for node, row in enumerate(csvreader, 1):
csvwriter.writerow(dict(row, url_source=csvUrl, downloaded_at=today))
return
1 个回答
5
你的代码只做了一件事:要么它会读取并跳过(丢弃)一行,然后返回,要么它会读取整个文件并复制到一个新的CSV文件里。它不会同时做这两件事。
如果你不能确定第一行是表头,那就不要依赖自动从文件中加载DictReader()
的字段名。你需要手动找到表头,然后把它们传递给DictReader()
的构造函数。
首先把CSV文件当作普通的csv.reader()
打开,找到实际的表头所在的第一行,然后再用那一行作为字段名,重新加载文件为csv.DictReader()
:
with open(fileName, 'rb') as inf, open("out_"+fileName, 'wb') as outf:
reader = csv.reader(inf)
# find header row
for row in reader:
if '' not in row:
fieldnames = row
break
else:
# oops, *only* rows with empty cells found
raise ValueError('Unable to determine header row')
# rewind, switch to DictReader, skip past header
inf.seek(0)
reader = csv.DictReader(inf, fieldnames)
for row in reader:
if row.keys() == row.values()
break
# copy all rows across with extra two columns
writer = csv.DictWriter(outf, ['url_source','downloaded_at'] + fieldnames)
writer.writeheader()
writer.writerows(dict(r, url_source=csvUrl, downloaded_at=today)
for r in reader)