csv 모듈을 사용하여 csv 파일에서 특정 열을 읽습니까?


176

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

그리고 이것이 내가 제외하고 각 행에 대해 원하는 특정 열만 인쇄 할 것으로 기대합니다. 마지막 열만 얻습니다.


1
'rb'플래그를 open()? 간단하지 않아야 r합니까?
Elazar

7
@Elazar : Python 2 (OP에서 사용중인) "rb"는로 전달하는 데 적합합니다 csv.reader.
DSM

예제 CSV 파일이 파이프 문자를 분리 문자로 표시하지만 예제 코드가 공백을 사용하는 이유는 무엇입니까?
Kelly S. French

1
@ KellyS.French이 질문의 목적을 위해 데이터를 시각화하는 데 도움이 될 것이라고 생각했습니다.
frankV

답변:


187

당신이 당신의 인쇄 문을 포함하지 않는 경우이 코드에서 마지막 열을 얻는 것입니다 유일한 방법은 당신의 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

실수를 다뤘으 므로 이번에는 팬더 모듈 을 소개하겠습니다 .

팬더는 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

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

추신 : 나는 다른 사람들이 말한 것을 간단한 방식으로 모으고 있습니다. 실제 답변은 여기여기 에서 가져옵니다 .


1
팬더는 완벽하게 수용 가능한 솔루션이라고 생각합니다. 팬더를 자주 사용하고 라이브러리를 좋아하지만이 질문은 특히 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 모듈을 사용하여 '수동으로'작업을 수행 할 때 많은 작업과 잠재적 좌절을 줄일 수 있습니다. csv 모듈을 여전히 사용하는 유일한 사람은 AFAIK이지만 아직 테이블 형식 데이터 (팬더, 페트롤 등)를 다루기위한 더 나은 도구를 찾지 못한 사람들입니다. 다양한 이상한 소스에서 경력, 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')

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가 아닌 팬더를 생성합니다 dataframe. ayhan의 제안은 usecols속도가 문제가 될 경우 더 빠릅니다. %timeit2122 KB 크기의 CSV 파일을 사용하여 두 가지 접근 방식을 테스트하면 22.8 ms유 스콜 접근 방식과 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.