【问题标题】:Can't skip header row in csv file with python无法使用python跳过csv文件中的标题行
【发布时间】:2019-08-07 15:47:27
【问题描述】:

我在 python 中使用 CSV 模块将 CSV 读入内存,我需要跳过标题行。

我正在使用下一个命令跳过标题,但它不起作用。

import csv
with open(aws_env_list) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    next(csv_reader)

标题仍在生成中,导致我的脚本崩溃。我的脚本生成以下行:

Working in AWS Account:  companyAccountName,AWSAccountName,Description,LOB,AWSAccountNumber,CIDRBlock,ConnectedtoMontvale,PeninsulaorIsland,URL,Owner,EngagementCode,CloudOpsAccessType

在原始 CSV 中,标题仅在第一行。

我csv file look like this.的前几行

上面有什么问题,为什么不跳过标题?有没有更好的办法?

【问题讨论】:

  • 您需要清楚“它不起作用”是什么意思。该代码将跳过 csv 文件的第一行,可能标题超过两行。我们不知道,因为我们看不到该文件的任何内容。
  • 好的,我会立即更新我的 OP。
  • 您粘贴的 csv 有制表符分隔符。您可能希望将代码更新为csv_reader = csv.reader(csv_file, delimiter='\t')。你不会在交互式提示符下输入这个,对吗?
  • 谢谢,不,这是复制粘贴。

标签: python csv


【解决方案1】:

我认为您没有正确使用 next() 函数。

这是文档中的一个示例:

import csv

with open('eggs.csv', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
    for row in spamreader:
        print(', '.join(row))

当您使用 csv.reader 时,它会获取 csv 文件并为每一行创建一个可迭代对象。因此,如果您想跳过第一行(标题行),只需进行此更改即可。

with open(aws_env_list) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for row in list(csv_reader)[1:]:
        """ do whatever action """

当您将 [1:] 添加到 csv_reader 的末尾时,它会告诉它只选择第二个对象(因为 0 是第一个)。您实际上创建了一个不包含第一个元素的对象子集。

【讨论】:

  • next() 的使用是正确的,因为它不会像您的代码那样扩展迭代器。对于大型 CSV 文件,这将导致大量不必要的内存使用。我怀疑问题在于 OP 在产生第一行并丢弃它后根本没有开始迭代
  • csv_reader[1:] 将不起作用,因为 reader 对象不可下标,因为它是一个迭代器。从技术上讲,这可以通过 list(csv_reader)[1:] 解决,但这违背了拥有迭代器的目的。 OP 使用 next(csv_reader) 做正确的事情。
  • @roganjosh:切片根本不起作用。 (另一方面,itertools.islice(csv_reader, 1, None)...) OP 确实有错误的分隔符(应该是制表符时的逗号),但这不会导致这个问题。可以使它看起来没有跳过的一件事是在交互式提示中运行代码。未分配表达式的结果以交互模式回显到终端。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多