簡體   English   中英

查找csv文件中的列數

[英]Find number of columns in csv file

我的程序需要讀取可能有 1,2 或 3 列的 csv 文件,並且需要相應地修改其行為。 有沒有一種簡單的方法可以在迭代器運行之前檢查列數而不“消耗”一行? 以下代碼是我能管理的最優雅的代碼,但我更願意在 for 循環開始之前運行檢查:

import csv
f = 'testfile.csv'
d = '\t'

reader = csv.reader(f,delimiter=d)
for row in reader:
    if reader.line_num == 1: fields = len(row)
    if len(row) != fields:
        raise CSVError("Number of fields should be %s: %s" % (fields,str(row)))
    if fields == 1:
        pass
    elif fields == 2:
        pass
    elif fields == 3:
        pass
    else:
        raise CSVError("Too many columns in input file.")

編輯:我應該包含有關我的數據的更多信息。 如果只有一個字段,它必須包含一個以科學計數法表示的名稱。 如果有兩個字段,第一個必須包含名稱,第二個必須包含鏈接代碼。 如果有三個字段,附加字段包含一個標志,用於指定名稱當前是否有效。 因此,如果任何行有 1、2 或 3 列,則所有列都必須相同。

您可以使用itertools.tee

itertools.tee(iterable[, n=2])
從單個可迭代對象返回 n 個獨立迭代器。

例如。

reader1, reader2 = itertools.tee(csv.reader(f, delimiter=d))
columns = len(next(reader1))
del reader1
for row in reader2:
    ...

請注意,完成后刪除對reader1的引用很重要 - 否則tee將不得不將所有行存儲在內存中,以防您再次調用next(reader1)

這似乎也有效:

import csv

datafilename = 'testfile.csv'
d = '\t'
f = open(datafilename,'r')

reader = csv.reader(f,delimiter=d)
ncol = len(next(reader)) # Read first line and count columns
f.seek(0)              # go back to beginning of file
for row in reader:
    pass #do stuff

如果用戶向您提供列數較少的 CSV 文件會發生什么情況? 是否使用默認值?

如果是這樣,為什么不使用空值擴展行呢?

reader = csv.reader(f,delimiter=d)
for row in reader:
    row += [None] * (3 - len(row))
    try:
        foo, bar, baz = row
    except ValueError:
        # Too many values to unpack: too many columns in the CSV
        raise CSVError("Too many columns in input file.")

現在 bar 和 baz 至少是None並且異常處理程序將處理超過 3 個項目的任何行。

我會建議一個簡單的方法是這樣的:

with open('./testfile.csv', 'r') as csv:
     first_line = csv.readline()
     your_data = csv.readlines()

ncol = first_line.count(',') + 1 

我會按如下方式重建它(如果文件不是太大):

import csv
f = 'testfile.csv'
d = '\t'

reader = list(csv.reader(f,delimiter=d))
fields = len( reader[0] )
for row in reader:
    if fields == 1:
        pass
    elif fields == 2:
        pass
    elif fields == 3:
        pass
    else:
        raise CSVError("Too many columns in input file.")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM