如何正确处理 csv.reader 标头

Sem*_*aki 0 python csv

读取 csv 文件时,有时第一行(或多行)是我们不想包含在数据中的标题。

如果我不需要next在声明阅读器之前使用的标题中的数据(如果标题使用多于一行,我可以多次调用 next):

with open('myfile.csv', 'rb') as f:
    next(f)                         #skip first row
    reader = csv.reader(f)
    for row in reader:
        #process my data
Run Code Online (Sandbox Code Playgroud)

然而有时我不想在我的数据中包含标题但仍然需要它们的值。在这种情况下,我将其csv.reader转换为列表并单独处理标题。

with open('myfile.csv', 'rb') as f:
    reader = list(csv.reader(f))

    my_header = reader.pop(0)   #remove header

    for row in reader:
        #process my data
Run Code Online (Sandbox Code Playgroud)

这很有效,我很高兴。但我不确定这是否是“最佳实践”的使用方式,csv.reader还有其他值得探索的方式。

bru*_*ers 5

这确实不是最佳实践 - 它无缘无故地读取内存中的整个文件。有趣的是,您的第一个代码段几乎没有什么可更改的以获取标题...

next(iterator) 确实返回“当前”元素:

>>> it = iter(["hello", "world"])
>>> next(it)
'hello'
>>> next(it)
'world'
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
Run Code Online (Sandbox Code Playgroud)

所以你所要做的就是

with open('myfile.csv', 'rb') as f:
    reader = csv.reader(f)
    headers = next(reader)
    for row in reader:
        #process my data
Run Code Online (Sandbox Code Playgroud)

FWIW,您在第一个代码段中跳过“第一行”的方式很脆弱 - 您实际上是在跳过第一,这不一定是第一(某些 csv 格式在行中嵌入了换行符),因此对于“不标题”版本你真正想要的:

with open('myfile.csv', 'rb') as f:
    reader = csv.reader(f)
    next(reader) # skip first row
    for row in reader:
        #process my data
Run Code Online (Sandbox Code Playgroud)