在Python csv

时间:2015-08-08 14:22:30

标签: python csv

我正在连接API来获取一些数据。输出是一个报告,其中包含一个多行标题以及传统的单行标题。

示例:

1. Document Name: Test
2. Document Date: 8/7/2015
3. Document ID: 3804804
4. Document Author: Joe Blow
5.
6. Date, ID, Name, Age, Sex, Result
7. 8/7/2015, 2808380, Sara Jenkings, 33, F, 208.20

在该示例中,我想跳过第1 - 5行,并将第6行的行写为标题行,将其后的所有其他行写为普通行。

现在,我知道如何通过一条线路跳过具有next(reader, None),但如何跳过多行,如果我知道跳过会像在实施例一致5行的行数

我通常会使用数据库来跳过这些行,但是我想知道是否可以让Python正确保存数据而不需要数据库做更多的工作。

3 个答案:

答案 0 :(得分:11)

您可以使用itertools.islice,将要开始写入的行作为第二个参数传递,以便第6行为0时使用5如果stop为None,则迭代继续,直到迭代器耗尽

import  csv

from itertools import islice

with open("in.csv") as f, open("out.csv","w") as out:
    r = csv.reader(islice(f, start=5,stop=None))
    wr = csv.writer(out)
    wr.writerows(r)

如果要按原样保留行,则不一定需要csv模块:

with open("in.csv") as f, open("out.csv","w") as out:
    r = islice(f, 5 ,None)
    out.writelines(r)

答案 1 :(得分:2)

您可以将一个计数器和一个if语句添加到for循环中。

count = 0
for line in opened_file:
    if count < 5:
        count += 1
        continue
    #Parse lines

答案 2 :(得分:0)

使用列表理解跳过5个标题行:

import csv

nheaderlines = 5

with open(path + file) as csvfile:
    reader = csv.DictReader(csvfile)

    [next(reader, None) for item in range(nheaderlines)]

    for row in reader:
        print(row)