跳过行,csv Dict Reader Python

时间:2015-06-24 15:56:20

标签: python csv

我的文件有一个令人讨厌的标题前言。所以它看起来像这样:

Review performed by:    

Meeting:    

Person:     

Number:     

Code: 



Confirmation    

Tab Separated Header Names That I Want To Use

我想跳过所有内容并使用标签sep标题名称代码。这就是我到目前为止所做的:

reader = csv.DictReader(CSVFile)
for i in range(14): #trying to skip the first 14 rows
    reader.next()
for row in reader:
    print(row)
    if args.nextCode:
        tab = (row["Tab"])
        sep = int((row["Separated"]))

此代码出现此错误:

File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 104, in next
    row = self.reader.next()
StopIteration

我试图打印行,看看我在文件中的位置,然后我更改了"范围(14)"范围是5,但是当我打印行时,我得到了这个:

{'Review performed by:': 'Tab/tSeparated/tHeader/tNames/tThat/tI/tWant/tTo/tUse'}
Traceback (most recent call last):
  File "program.py", line 396, in <module>
    main()
  File "program.py", line 234, in main
    tab = (row["Tab"])
KeyError: 'Tab'

所以我不确定跳过这些顶线的正确方法。任何帮助,将不胜感激。

2 个答案:

答案 0 :(得分:14)

csv.DictReader在文件实例化时读取第一行,以获取后续行的标题。因此,它使用Review performed by:作为标题行,然后跳过接下来的14行。

相反,在创建DictReader之前跳过行

for i in range(14):
    CSVFile.next()
reader = csv.DictReader(CSVFile)
...

答案 1 :(得分:5)

您可以使用CSVFile迭代器对象包装itertools.islice,以在创建DictReader时切除前言的行,而不是直接将其提供给构造函数。

这是有效的,因为csv.reader构造函数将接受任何“支持 iterator 协议的对象,并在每次调用其next()方法时返回一个字符串” {3}}。这也适用于csv.DictReader,因为它们在内部使用基础reader实例。

N = 14  # number of lines to skip
for row in csv.DictReader(itertools.islice(CSVFile, N, None)):
    process row ...