我的文件有一个令人讨厌的标题前言。所以它看起来像这样:
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'
所以我不确定跳过这些顶线的正确方法。任何帮助,将不胜感激。
答案 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 ...