129

CSVデータの列から最小数を出力するようにPythonに要求していますが、一番上の行は列番号であり、Pythonに一番上の行を考慮させたくありません。Pythonが最初の行を無視するようにするにはどうすればよいですか?

これまでのコードは次のとおりです。

import csv

with open('all16.csv', 'rb') as inf:
    incsv = csv.reader(inf)
    column = 1                
    datatype = float          
    data = (datatype(column) for row in incsv)   
    least_value = min(data)

print least_value

コードを与えるだけでなく、あなたが何をしているのか説明してもらえますか?私はPythonに非常に慣れていないので、すべてを確実に理解したいと思います。

4

18 に答える 18

116

csvモジュールのクラスのインスタンスを使用して、CSVファイルの形式を推測し、必要な場合にのみ最初の行をスキップする組み込み関数Snifferとともにヘッダー行が存在するかどうかを検出できます。next()

import csv

with open('all16.csv', 'r', newline='') as file:
    has_header = csv.Sniffer().has_header(file.read(1024))
    file.seek(0)  # Rewind.
    reader = csv.reader(file)
    if has_header:
        next(reader)  # Skip header row.
    column = 1
    datatype = float
    data = (datatype(row[column]) for row in reader)
    least_value = min(data)

print(least_value)

datatypeとはあなたの例ではハードコーディングされているので、次のようcolumnに処理する方が少し速くなります。row

    data = (float(row[1]) for row in reader)

注:上記のコードはPython3.x用です。Python 2.xの場合、表示されているものの代わりに次の行を使用してファイルを開きます。

with open('all16.csv', 'rb') as file:
于 2012-07-05T18:11:23.543 に答える
84

最初の行をスキップするには、次のように呼び出します。

next(inf)

Pythonのファイルは、行の反復子です。

于 2012-07-05T18:15:26.130 に答える
36

Pythonクックブックから借用した、
より簡潔なテンプレートコードは次のようになります。

import csv
with open('stocks.csv') as f:
    f_csv = csv.reader(f) 
    headers = next(f_csv) 
    for row in f_csv:
        # Process row ...
于 2018-03-31T11:02:29.030 に答える
25

同様のユースケースでは、実際の列名の行の前にある煩わしい行をスキップする必要がありました。このソリューションはうまく機能しました。最初にファイルを読み取り、次にリストをに渡しますcsv.DictReader

with open('all16.csv') as tmp:
    # Skip first line (if any)
    next(tmp, None)

    # {line_num: row}
    data = dict(enumerate(csv.DictReader(tmp)))
于 2014-12-18T23:16:50.123 に答える
19

通常はnext(incsv)、イテレータを1行進めるを使用するため、ヘッダーをスキップします。もう1つ(30行スキップしたいとします)は次のようになります。

from itertools import islice
for row in islice(incsv, 30, None):
    # process
于 2012-07-05T17:26:10.380 に答える
8

csv.Readerの代わりにcsv.DictReaderを使用してください。fieldnamesパラメーターを省略した場合、csvfileの最初の行の値がフィールド名として使用されます。その後、row["1"]などを使用してフィールド値にアクセスできるようになります。

于 2012-07-05T17:53:17.560 に答える
4

Python 2.x

csvreader.next()

リーダーの反復可能なオブジェクトの次の行を、現在の方言に従って解析されたリストとして返します。

csv_data = csv.reader(open('sample.csv'))
csv_data.next() # skip first row
for row in csv_data:
    print(row) # should print second row

Python 3.x

csvreader.__next__()

リーダーの反復可能なオブジェクトの次の行を、現在の方言に従って解析されたリスト(オブジェクトがreader()から返された場合)またはdict(DictReaderインスタンスの場合)として返します。通常、これをnext(reader)と呼ぶ必要があります。

csv_data = csv.reader(open('sample.csv'))
csv_data.__next__() # skip first row
for row in csv_data:
    print(row) # should print second row
于 2020-07-26T04:49:38.360 に答える
3

Python 3 CSVモジュールのドキュメントには、次の例が記載されています。

with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... process CSV file contents here ...

Sniffer、CSVファイルに関する多くのことを自動検出しようとします。has_header()ファイルにヘッダー行があるかどうかを判断するには、そのメソッドを明示的に呼び出す必要があります。含まれている場合は、CSV行を繰り返すときに最初の行をスキップします。あなたはこのようにそれを行うことができます:

if sniffer.has_header():
    for header_row in reader:
        break
for data_row in reader:
    # do something with the row
于 2018-10-09T18:21:45.380 に答える
2

新しい「パンダ」パッケージは、「csv」よりも関連性が高い可能性があります。以下のコードはCSVファイルを読み取り、デフォルトでは最初の行を列ヘッダーとして解釈し、列全体の最小値を見つけます。

import pandas as pd

data = pd.read_csv('all16.csv')
data.min()
于 2014-08-28T15:43:50.953 に答える
2

これは私がやっていたことに関連しているので、ここで共有します。

ヘッダーがあるかどうかわからず、スニファなどをインポートしたくない場合はどうなりますか?

リストや配列の印刷や追加など、タスクが基本的なものである場合は、ifステートメントを使用できます。

# Let's say there's 4 columns
with open('file.csv') as csvfile:
     csvreader = csv.reader(csvfile)
# read first line
     first_line = next(csvreader)
# My headers were just text. You can use any suitable conditional here
     if len(first_line) == 4:
          array.append(first_line)
# Now we'll just iterate over everything else as usual:
     for row in csvreader:
          array.append(row)
于 2018-05-01T18:06:14.107 に答える
1

ええと、私のミニラッパーライブラリもその仕事をします。

>>> import pyexcel as pe
>>> data = pe.load('all16.csv', name_columns_by_row=0)
>>> min(data.column[1])

一方、ヘッダー列のインデックス1がわかっている場合、たとえば「列1」の場合は、代わりに次のようにすることができます。

>>> min(data.column["Column 1"])
于 2014-12-01T10:18:06.853 に答える
1

私にとって最も簡単な方法は、範囲を使用することです。

import csv

with open('files/filename.csv') as I:
    reader = csv.reader(I)
    fulllist = list(reader)

# Starting with data skipping header
for item in range(1, len(fulllist)): 
    # Print each row using "item" as the index value
    print (fulllist[item])  
于 2018-03-12T12:44:08.670 に答える
1

csvreaderをリストに変換してから、最初の要素をポップします

import csv        

with open(fileName, 'r') as csvfile:
        csvreader = csv.reader(csvfile)
        data = list(csvreader)               # Convert to list
        data.pop(0)                          # Removes the first row

        for row in data:
            print(row)
于 2020-03-27T11:21:57.337 に答える
1

これは非常に古い質問かもしれませんが、パンダを使用すると非常に簡単な解決策があります

import pandas as pd

data=pd.read_csv('all16.csv',skiprows=1)
data['column'].min()

skiprows = 1の場合、最初の行をスキップして、data ['column']。min()を使用して最小値を見つけることができます。

于 2020-09-16T01:34:57.780 に答える
0

不要な最初の行を取り除くためにテールを使用します:

tail -n +2 $INFIL | whatever_script.py 
于 2015-09-13T10:26:15.487 に答える
0

[1:]を追加するだけです

以下の例:

data = pd.read_csv("/Users/xyz/Desktop/xyxData/xyz.csv", sep=',', header=None)**[1:]**

それはiPythonで私のために働きます

于 2015-11-01T00:02:39.093 に答える
0

Python 3.X

UTF8 BOM+HEADERを処理します

モジュールがヘッダーを簡単に取得できないことは非常に苛立たしいcsvことでした。UTF-8BOM(ファイルの最初の文字)にもバグがあります。これは、csvモジュールのみを使用して機能します。

import csv

def read_csv(self, csv_path, delimiter):
    with open(csv_path, newline='', encoding='utf-8') as f:
        # https://bugs.python.org/issue7185
        # Remove UTF8 BOM.
        txt = f.read()[1:]

    # Remove header line.
    header = txt.splitlines()[:1]
    lines = txt.splitlines()[1:]

    # Convert to list.
    csv_rows = list(csv.reader(lines, delimiter=delimiter))

    for row in csv_rows:
        value = row[INDEX_HERE]
于 2016-10-26T09:32:51.130 に答える
0

簡単な解決策は、csv.DictReader()を使用することです

import csv

def read_csv(file): with open(file, 'r') as file:
    reader = csv.DictReader(file)
    for row in reader:
        print(row["column_name"])  # Replace the name of column header.
于 2021-12-21T11:40:04.287 に答える