跳过行,csv Dict Reader Python

Ste*_*lis 9 python csv

我有一个文件,头部有一个令人讨厌的序言.所以它看起来像这样:

Review performed by:    

Meeting:    

Person:     

Number:     

Code: 



Confirmation    

Tab Separated Header Names That I Want To Use
Run Code Online (Sandbox Code Playgroud)

我想跳过所有内容并使用tab 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"]))
Run Code Online (Sandbox Code Playgroud)

此代码出现此错误:

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
Run Code Online (Sandbox Code Playgroud)

我试图打印行,看看我在文件中的位置,然后我将"range(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'
Run Code Online (Sandbox Code Playgroud)

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

jon*_*rpe 15

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

而是创建之前跳过行DictReader:

for i in range(14):
    CSVFile.next()
reader = csv.DictReader(CSVFile)
...
Run Code Online (Sandbox Code Playgroud)

  • CSV 行可以跨越多行。这会跳过文件中的前 14 *行*,而不是 CSV 的 14 行。 (2认同)

mar*_*eau 5

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

这是可行的,因为csv.reader构造函数将根据csv docs接受任何“支持迭代器协议并在每次next()调用其方法时返回一个字符串的对象” 。这也适用于,因为它们在内部使用基础实例。csv.DictReaderreader

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