CSV 파일을 구문 분석하고 특정 열에서만 데이터를 추출하려고합니다.
CSV 예 :
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
나는 특정 열을 캡처 말을하기 위해 노력하고있어 ID
, Name
, Zip
와 Phone
.
내가 본 코드를 사용하면 특정 열을 해당 번호로 호출 할 수 있다고 생각하게되었습니다. 즉, 각 행에 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
그리고 이것이 내가 제외하고 각 행에 대해 원하는 특정 열만 인쇄 할 것으로 기대합니다. 마지막 열만 얻습니다.
답변
당신이 당신의 인쇄 문을 포함하지 않는 경우이 코드에서 마지막 열을 얻는 것입니다 유일한 방법은 에 당신의 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
루프 상태이고 여전히 마지막 열만 인쇄하는 경우에는 발생하지 않아야하지만 내 가정이 잘못되었는지 알려주십시오. 게시 된 코드에는 들여 쓰기 오류가 많으므로 어디에 있어야하는지 알기가 어렵습니다. 이것이 도움이 되었기를 바랍니다!
답변
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=" ")
답변
팬더 사용 :
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'])
추신 : 나는 다른 사람들이 말한 것을 간단한 방식으로 모으고 있습니다. 실제 답변은 여기 와 여기 에서 가져옵니다 .
답변
로 팬더 당신은 사용할 수 read_csv
와 usecols
매개 변수 :
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
답변
사용할 수 있습니다 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')
답변
컨텍스트 :이 유형의 작업에는 놀라운 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')
답변
더 쉬운 방법이 있다고 생각합니다
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 |