【问题标题】:Skipping lines, csv.DictReader跳线,csv.DictReader
【发布时间】:2015-09-10 22:30:52
【问题描述】:

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

Review performed by:    

Meeting:    

Person:     

Number:     

Code: 



Confirmation    

Tab Separated Header Names That I Want To Use

我想跳过所有内容并为我的代码使用 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"]))

此代码出现此错误:

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

我尝试打印行,以查看我在文件中的位置,并将“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'

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

【问题讨论】:

  • 您的回溯与发布的代码不匹配。请提供MCVE

标签: python python-2.7 csv


【解决方案1】:

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

相反,在创建DictReader:

之前跳过行
for i in range(14):
    CSVFile.next()
reader = csv.DictReader(CSVFile)
...

【讨论】:

  • 非常感谢。我没有意识到它是在实例化的时候。信息量很大!
  • 一个 CSV 行可以跨越多行。这是跳过文件中的前 14 个 ,而不是 14 个 CSV 行。
  • @Boris true,编辑为指的是跳过行而不是行。
  • @Boris:您可以通过调用next(reader) 一次或多次来跳过iff 要跳过的数据是CSV 格式的——否则跳过行是唯一有意义的事情。
【解决方案2】:

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

这是因为csv.reader 构造函数将接受“任何支持iterator 协议并在每次调用其__next__() 方法时返回一个字符串”作为其第一个参数csv docs。这也适用于csv.DictReaders,因为它们是通过底层csv.reader 实例实现的。

注意next(iterator).split() 表达式如何为csv.DictReader 提供一个fieldnames 参数(因此它在实例化时不会从文件的第一行获取)。

iterator = itertools.islice(CSVFile, 14, None)  # Skip header lines.
for row in csv.DictReader(CSVFile, next(iterator).split(), delimiter='\t'):
    # process row ...

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2011-06-14
    • 2015-02-26
    • 2012-12-18
    • 2011-11-27
    • 2014-03-03
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多