web-dev-qa-db-ja.com

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

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

Csvの例:

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

IDNameZipPhoneのように、特定の列だけをキャプチャしようとしています。

私が見たコードは、対応する番号で特定の列を呼び出すことができると信じさせてくれました。つまり、Name2に対応し、row[2]を使用して各行を繰り返すと列2のすべての項目が生成されます。 t。

これが私がこれまでにやったことです:

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

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

138
frankV

このコードから最後の列を取得する唯一の方法は、printステートメントを含めない場合です。 in your 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 モジュールを紹介するためにこの時間をかけたいと思います。

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ループに入っていて、それがまだ最後のコラムを出力しているだけであったとしても、それは起こらないはずですが、私の仮定が間違っていたかどうか私に知らせてください。投稿されたコードにはたくさんの字下げエラーがあるので、何がどこにあるべきかを知るのは困難でした。これが役に立ったことを願っています!

154
Ryan Saxe
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=" ")

94
HennyH

パンダ を使用:

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'])

P.S私は他人が言ったことを簡単な方法でまとめているだけです。実際の答えは here および here から取られます。

19
VasiliNovikov

pandas を使用すると、 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
14
ayhan

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')
13
G M

コンテキスト:この種の作業には、すばらしいpython petlライブラリを使用してください。標準のcsvモジュールを使って手動で作業することによる多くの作業とフラストレーションの節約になります。私の知る限り、まだcsvモジュールを使用しているのは、表形式のデータ(パンダ、petlなど)を操作するための優れたツールをまだ発見していない人だけです。 petlのような何かを学ぶことは、さまざまな奇妙な情報源からのあなたのキャリアがあなたができる最も良い投資の一つです。 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')
5
PeteBeat
import pandas as pd 
csv_file = pd.read_csv("file.csv") 
column_val_list = csv_file.column_name._ndarray_values
1
Hari K

列名 を取得するには、 readlines() を使用するのではなく、 readline() を使用してループ全体を読み、ファイル全体を読み、配列に格納します。

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

    # get number of columns

    line = csvfile.readline()

    first_item = line.split(',')
0
Suren

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

ids, names, zips, phones = Zip(*(
  (row[1], row[2], row[6], row[7])
  for row in reader
))
0
Robert Jensen

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

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

考慮すべき点がいくつかあります。

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

そしてimport pandas as pdを忘れないで

0
vestland