Python,CSV,根据内容跳线

woo*_*ine 2 python csv

我正在处理标题前带有缓冲区行的 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)

Mar*_*ers 5

你的代码做了件事;要么它会读取和放弃(跳过)一个排,然后返回,或者它会读取整个文件,并复制到一个新的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)