1. ホーム
  2. python

[解決済み] csvモジュールでcsvファイルから特定の列を読み取る?

2022-04-18 17:25:02

質問

csvファイルを解析して、特定の列だけからデータを抽出しようとしています。

csvの例です。

ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |

特定のカラムだけを取り込みたいのですが、例えば ID , Name , ZipPhone .

私が見たコードでは、特定のカラムを対応する番号で呼び出すことができると考えられています。 Name に対応するのは 2 を使い、各行を反復して row[2] を実行すると、2列目のすべての項目が生成されます。しかし、そうはならない。

ここまでは、こんな感じです。

import sys, argparse, csv
from settings import *

# command arguments
parser = argparse.ArgumentParser(description='csv to postgres',\
 fromfile_prefix_chars="@" )
parser.add_argument('file', help='csv file to import', action='store')
args = parser.parse_args()
csv_file = args.file

# open csv file
with open(csv_file, 'rb') as csvfile:

    # get number of columns
    for line in csvfile.readlines():
        array = line.split(',')
        first_item = array[0]

    num_columns = len(array)
    csvfile.seek(0)

    reader = csv.reader(csvfile, delimiter=' ')
        included_cols = [1, 2, 6, 7]

    for row in reader:
            content = list(row[i] for i in included_cols)
            print content

そして、私はこれが各行について私が望む特定の列だけをプリントアウトすると期待しているのですが、そうではなく、私は最後の列だけを得ます。

どうすればいいですか?

このコードで最後のカラムを取得する唯一の方法は、printステートメントを含めない場合です。 あなたの for のループになります。

これは、あなたのコードの終わりである可能性が高いです。

for row in reader:
    content = list(row[i] for i in included_cols)
print content

こうであってほしい。

for row in reader:
        content = list(row[i] for i in included_cols)
        print content

さて、ここまででミスをカバーできたので、この場をお借りして パンダ モジュールです。

Pandasはcsvファイルを扱うのに最適で、以下のコードでcsvを読み込み、列全体を変数に保存することができます。

import pandas as pd
df = pd.read_csv(csv_file)
saved_column = df.column_name #you can also use df['column_name']

というわけで、カラムの情報をすべて保存したい場合は、次のようにします。 Names を変数に入れるだけです。

names = df.Names

素晴らしいモジュールなので、一度調べてみることをお勧めします。もし、何らかの理由でprint文が for のループで、やはり最後の列しか出力されなかったのですが、そんなことはないはずですが、私の推測が間違っていたら教えてください。あなたの投稿したコードはインデントの間違いが多いので、何がどこにあるべきか分かりにくかったのです。お役に立てれば幸いです。