如何正确处理csv.reader标头

时间:2017-11-14 14:16:48

标签: python csv

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

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

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

但有时我不想在我的数据中包含标题但仍需要它们的值。在这种情况下,我将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

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

2 个答案:

答案 0 :(得分:4)

这确实不是最好的做法 - 它没有任何理由在内存中读取整个文件。有趣的是,你的第一个片段几乎没有什么可以改变来获得标题......

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

所以你要做的就是

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

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

答案 1 :(得分:0)

使用标题行组织的csv文件的简单方法,然后是值:csv + DictReader 例如:

with open ('myfile.csv', 'r') as csv_file:
csv_reader = csv.DictReader (csv_file)
     for row in csv_reader:
         print (row.get ('column1')) # print the value of column1 without title

使用此方法,您可以忽略标题行并精确定位所需的数据,并且您的代码将更清晰。 给我一个回报,稍后再见。