我正在处理标题前带有缓冲区行的 csv 文件,行数各不相同,有些行包含字符串,有些行不包含。唯一一致的是,这些缓冲区行在一个或多个单元格中都包含空值,因此我试图跳过具有空单元格的任何行。
我有以下脚本,但它正在输出一个空白文件。我猜我没有进入“其他”,但我猜如果我把它放在一个循环中,我最终会为每一行创建一个文件......
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
Run Code Online (Sandbox Code Playgroud)
你的代码做了一件事;要么它会读取和放弃(跳过)一个排,然后返回,或者它会读取整个文件,并复制到一个新的CSV。它永远不会两者兼而有之。
如果您不能指望包含标题的第一行,则不要依赖于DictReader()从文件中自动加载字段名。手动查找标题,然后将它们传递给DictReader()构造函数。
csv.reader() 首先以常规方式打开 CSV ,找到作为实际标题的第一行,然后将文件重新加载为 a 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1458 次 |
| 最近记录: |