首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用csv模块从csv文件中读取特定列?

使用csv模块从csv文件中读取特定列?
EN

Stack Overflow用户
提问于 2013-05-12 10:10:38
回答 9查看 712.1K关注 0票数 198

我正在尝试解析csv文件,并仅从特定列中提取数据。

示例csv:

代码语言:javascript
复制
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中的所有项。但它不是。

以下是我到目前为止所做的工作:

代码语言:javascript
复制
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

我期望它只打印出我想要的每一行的特定列,但它不是这样的,我只得到最后一列。

EN

回答 9

Stack Overflow用户

发布于 2013-05-12 10:34:03

代码语言:javascript
复制
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'])

使用像这样的文件

代码语言:javascript
复制
name,phone,street
Bob,0893,32 Silly
James,000,400 McHilly
Smithers,4442,23 Looped St.

将输出

代码语言:javascript
复制
>>> 
['Bob', 'James', 'Smithers']
['0893', '000', '4442']
['32 Silly', '400 McHilly', '23 Looped St.']

或者,如果您想要对列进行数字索引:

代码语言:javascript
复制
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=" ")

票数 117
EN

Stack Overflow用户

发布于 2017-05-23 17:05:23

使用pandas

代码语言:javascript
复制
import pandas as pd
my_csv = pd.read_csv(filename)
column = my_csv.column_name
# you can also use my_csv['column_name']

在分析时丢弃不需要的列:

代码语言:javascript
复制
my_filtered_csv = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])

附言:我只是以一种简单的方式汇总了别人说过的话。实际答案取自herehere

票数 31
EN

Stack Overflow用户

发布于 2014-01-10 21:46:05

您可以使用numpy.loadtext(filename)。例如,如果这是您的数据库.csv

代码语言:javascript
复制
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列:

代码语言:javascript
复制
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

代码语言:javascript
复制
b = np.genfromtxt(r'filepath\name.csv', delimiter='|', names=True,dtype=None)
>>> b['Name']
array([' Adam ', ' Carl ', ' Adolf ', ' Den '], 
      dtype='|S7')
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16503560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档