csvモジュールでcsvファイルから特定の列を読み取りますか?


176

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

csvの例:

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

私が言って、特定の列のみを捕獲しようとしているIDNameZipPhone

私が調べたコードは、対応する番号で特定の列を呼び出すことができると信じるように導いたので、つまり: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

そして、これは、各行に必要な特定の列のみを出力することを期待しています。ただし、出力しない場合は、最後の列のみを取得します。


1
なぜ'rb'フラグを立てopen()ますか?簡単ではないrですか?
Elazar 2013年

7
@Elazar:(OPが使用している)Python 2では"rb"に渡すのに適していcsv.readerます。
DSM 2013年

サンプルCSVファイルに区切り文字としてパイプ文字が表示されているのに、サンプルコードではスペースが使用されているのはなぜですか?
ケリーS.フランス語

1
@ KellyS.Frenchこの質問の目的でデータを視覚化するのに役立つと思いました。
frankV

回答:


187

このコードから最後の列を取得する唯一の方法forループにprintステートメント含めない場合です。

これはおそらくコードの終わりです:

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

それは素晴らしいモジュールであり、それを検討することをお勧めします。なんらかの理由で印刷ステートメントがforループしていて、まだ最後の列だけが印刷されている場合は、これは発生しないはずですが、私の想定が間違っていたかどうかをお知らせください。投稿されたコードにはインデントエラーが多数含まれているため、何がどこにあるのかを知るのが困難でした。これがお役に立てば幸いです!


1
クエリからインデックス番号を削除することは可能ですか?@Ryan Saxe
Malachi Bazar

はい、forループで繰り返します。
davegallant 2017

109
import csv
from collections import defaultdict

columns = defaultdict(list) # each value in each column is appended to a list

with open('file.txt') as f:
    reader = csv.DictReader(f) # read rows into a dictionary format
    for row in reader: # read a row as {column1: value1, column2: value2,...}
        for (k,v) in row.items(): # go over each column name and value 
            columns[k].append(v) # append the value into the appropriate list
                                 # based on column name k

print(columns['name'])
print(columns['phone'])
print(columns['street'])

のようなファイルで

name,phone,street
Bob,0893,32 Silly
James,000,400 McHilly
Smithers,4442,23 Looped St.

出力されます

>>> 
['Bob', 'James', 'Smithers']
['0893', '000', '4442']
['32 Silly', '400 McHilly', '23 Looped St.']

または、列の数値インデックスが必要な場合:

with open('file.txt') as f:
    reader = csv.reader(f)
    reader.next()
    for row in reader:
        for (i,v) in enumerate(row):
            columns[i].append(v)
print(columns[0])

>>> 
['Bob', 'James', 'Smithers']

デリミネーターを変更するdelimiter=" "には、適切なインスタンス化を追加します。reader = csv.reader(f,delimiter=" ")


30

パンダを使う:

import pandas as pd
my_csv = pd.read_csv(filename)
column = my_csv.column_name
# you can also use my_csv['column_name']

解析時に不要な列を破棄します。

my_filtered_csv = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])

PS私は他の人が言ったことを単純な方法で集約しているだけです。実際の答えはここここから取られます


1
パンダは完全に受け入れられる解決策だと思います。私はPandasを頻繁に使用し、本当にライブラリを気に入っていますが、この質問は特にCSVモジュールを参照しています。
frankV

1
@frankVさて、タイトル、タグ、最初の段落はパンダを決して禁じていません、AFAIは見ることができます。私は実際に、ここですでに作成されたものに簡単な答えを追加したいと思っています(他の答えもパンダを使用しています)。
VasiliNovikov

18

パンダを使用できread_csvusecols、パラメータ:

df = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])

例:

import pandas as pd
import io

s = '''
total_bill,tip,sex,smoker,day,time,size
16.99,1.01,Female,No,Sun,Dinner,2
10.34,1.66,Male,No,Sun,Dinner,3
21.01,3.5,Male,No,Sun,Dinner,3
'''

df = pd.read_csv(io.StringIO(s), usecols=['total_bill', 'day', 'size'])
print(df)

   total_bill  day  size
0       16.99  Sun     2
1       10.34  Sun     3
2       21.01  Sun     3

16

使用できますnumpy.loadtext(filename)。たとえば、これがデータベースの場合.csv

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

そして、あなたはName列が欲しい:

import numpy as np 
b=np.loadtxt(r'filepath\name.csv',dtype=str,delimiter='|',skiprows=1,usecols=(1,))

>>> b
array([' Adam ', ' Carl ', ' Adolf ', ' Den '], 
      dtype='|S7')

より簡単に使用できますgenfromtext

b = np.genfromtxt(r'filepath\name.csv', delimiter='|', names=True,dtype=None)
>>> b['Name']
array([' Adam ', ' Carl ', ' Adolf ', ' Den '], 
      dtype='|S7')

@G「filepath \ name.csv」の横にrがあるはずですか?
114

6

コンテキスト:このタイプの作業には、すばらしいpython petlライブラリーを使用する必要があります。これにより、標準のcsvモジュールで「手動」で行う作業から多くの作業と潜在的なフラストレーションを節約できます。AFAIK、まだcsvモジュールを使用している唯一の人々は、表データ(pandas、petlなど)を処理するためのより良いツールをまだ発見していない人々ですが、これは問題ありませんが、さまざまな奇妙な情報源からのキャリア、petlのようなものを学ぶことは、あなたができる最高の投資の1つです。開始するには、pip install petlを実行してから30分しかかかりません。ドキュメントは素晴らしいです。

回答:csvファイルに最初のテーブルがあるとします(petlを使用してデータベースから直接ロードすることもできます)。次に、それをロードして次のようにします。

from petl import fromcsv, look, cut, tocsv 

#Load the table
table1 = fromcsv('table1.csv')
# Alter the colums
table2 = cut(table1, 'Song_Name','Artist_ID')
#have a quick look to make sure things are ok. Prints a nicely formatted table to your console
print look(table2)
# Save to new file
tocsv(table2, 'new.csv')

4

もっと簡単な方法があると思います

import pandas as pd

dataset = pd.read_csv('table1.csv')
ftCol = dataset.iloc[:, 0].values

したがって、ここiloc[:, 0]:は、すべての値を0意味し、列の位置を意味します。以下の例でIDは選択されます

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


3
import pandas as pd 
csv_file = pd.read_csv("file.csv") 
column_val_list = csv_file.column_name._ndarray_values

pip install pandas最初にする必要があります
ボリス

1

パンダのデータフレームにインデックスを付けてサブセット化する方法のおかげで、csvファイルから単一の列を変数に抽出する非常に簡単な方法は次のとおりです。

myVar = pd.read_csv('YourPath', sep = ",")['ColumnName']

考慮すべきいくつかのこと:

上記のスニペットは、パンダSeriesではなくパンダを生成しますdataframeusecols速度が問題となる場合、ayhanからの提案も速くなります。%timeit2122 KBのサイズのcsvファイルを使用して2つの異なるアプローチをテストする22.8 msと、usecolsアプローチと53 ms提案されたアプローチが生成されます。

そして、忘れないでください import pandas as pd


0

列を個別に処理する必要がある場合は、zip(*iterable)パターンを使用して列を分解します(事実上「解凍」)。だからあなたの例では:

ids, names, zips, phones = zip(*(
  (row[1], row[2], row[6], row[7])
  for row in reader
))

-1

列名をフェッチするには、readlines()を使用する代わりに、readline()を使用してループを回避し、ファイル全体を読み取って配列に格納することを避けます。

with open(csv_file, 'rb') as csvfile:

    # get number of columns

    line = csvfile.readline()

    first_item = line.split(',')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.