当前位置: 首页 > 面试题库 >

如何使用csv.DictReader跳过标题前行?

鲁波光
2023-03-14
问题内容

我想csv.DictReaderhtml" target="_blank">文件中推断出字段名称。文档说:
“如果省略fieldnames参数,则csvfile第一行中的值将用作字段名。” ,但在我的情况下,第一行包含标题,第二行包含名称。

我无法next(reader)按照Python
3.2的要求在csv.DictReader中跳过一行,
因为在初始化读取器时发生了字段名分配(否则我做错了)。

csvfile(从Excel
2010导出,原始源):

CanVec v1.1.0,,,,,,,,,^M
Entity,Attributes combination,"Specification Code
Point","Specification Code
Line","Specification Code
Area",Generic Code,Theme,"GML - Entity name
Shape - File name
Point","GML - Entity name
Shape - File name
Line","GML - Entity name
Shape - File name
Area"^M
Amusement park,Amusement park,,,2260012,2260009,LX,,,LX_2260009_2^M
Auto wrecker,Auto wrecker,,,2360012,2360009,IC,,,IC_2360009_2^M

我的代码:

f = open(entities_table,'rb')
try:
    dialect = csv.Sniffer().sniff(f.read(1024))
    f.seek(0)

    reader = csv.DictReader(f, dialect=dialect)
    print 'I think the field names are:\n%s\n' % (reader.fieldnames)

    i = 0
    for row in reader:
        if i < 20:
            print row
            i = i + 1

finally:
    f.close()

当前结果:

I think the field names are:
['CanVec v1.1.0', '', '', '', '', '', '', '', '', '']

所需结果:

I think the field names are:
['Entity','Attributes combination','"Specification Code Point"',...snip]

我意识到只删除第一行并继续进行是很方便的,但是我正在尝试尽可能地就地读取数据并尽量减少人工干预。


问题答案:

我从itertools使用过islice。我的标题位于重要序言的最后一行。我已经通过了序言,并使用hederline作为字段名:

with open(file, "r") as f:
    '''Pass preamble'''
    n = 0
    for line in f.readlines():
        n += 1
        if 'same_field_name' in line: # line with field names was found
            h = line.split(',')
            break
    f.close()
    f = islice(open(i, "r"), n, None)

    reader = csv.DictReader(f, fieldnames = h)


 类似资料:
  • 问题内容: 用csv.DictReader处理CSV文件很棒- 但是我有带注释行的CSV文件(在行的开头用哈希表示),例如: csv模块不包含任何跳过此类行的方法。 我可以轻松地做些骇人听闻的事情,但是我想有一种将csv.DicReader包装在其他迭代器对象周围的好方法,该对象会进行预处理以丢弃行。 问题答案: 实际上,这与:

  • 问题内容: 使用DictReader时,如何跳过CSV中的一行记录? 码: 错误: 问题答案: 您改为使用。 来源:csv.DictReader文档

  • 对于我正在开发的应用程序,我有一个文本文件,我想使用BufferedReader读取它。文本文件中的前四行可能不相关,所以我不想读这些。我看了BufferedReader上的留档,我看到我可以使用BufferedReader.skip(字节),在那里我输入要跳过的字节数。然而,文本文件中的前四行并不总是包含相同数量的信息,所以我认为这并不真正适合我的目的。你们知道如何以更实际的方式解决这个问题吗?

  • 现在前3个整数是我需要广播的一些计数器。之后,所有行都具有相同的格式,如 我将在3个计数器后的所有这些值映射到一个新的RDD后,用它们在函数中做一些计算。但我无法理解如何分离前3个值,并正常映射其余值。 我的Python代码是这样的

  • 问题内容: 我正在使用下面引用的代码使用Python编辑CSV。代码中调用的函数构成了代码的上部。 问题:我希望下面引用的代码从第二行开始编辑csv,我希望它排除包含标题的第一行。现在,它仅在第一行上应用函数,并且我的标题行正在更改。 我试图通过将变量初始化为来解决此问题,但没有成功。 请帮助我解决这个问题。 问题答案: 您的变量是可迭代的,通过循环它可以检索行。 要使其在循环前跳过一项,只需调用

  • 我使用下面提到的代码使用Python编辑csv。代码中调用的函数构成代码的上部。 问题:我希望下面引用的代码从第二行开始编辑csv,我希望它排除包含标题的第一行。现在它只在第一行应用函数,我的标题行正在更改。 我试图通过将变量初始化为来解决这个问题,但它不起作用。 请帮助我解决这个问题。