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

Python 使用csv模块从csv文件中读取特定列?,python,csv,Python,Csv,我试图通过csv文件进行解析,并仅从特定列中提取数据 示例csv: ID | Name | Address | City | State | Zip | Phone | OPEID | iped| 10 | C.|130 W.|莫|阿尔…|3.. | 334.. | 01023 | 10063 | 我试图只捕获特定的列,比如ID、Name、Zip和Phone 我看到的代码让我相信我可以通过相应的数字调用特定列,因此:Name将对应于2,使用row[2]遍历每一行将生成列2中的所有项。只是没有

我试图通过csv文件进行解析,并仅从特定列中提取数据

示例csv:

ID | Name | Address | City | State | Zip | Phone | OPEID | iped|
10 | C.|130 W.|莫|阿尔…|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
我希望这将只打印出我想要的每一行的特定列,除了没有,我只得到最后一列

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=“”)
从该代码中获取最后一列的唯一方法是,如果在
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非常适合处理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 = df.Names

这是一个很好的模块,我建议你研究一下。如果出于某种原因,您的print语句处于
for
循环中,并且仍然只打印最后一列,这是不应该发生的,但是如果我的假设是错误的,请告诉我。您发布的代码有很多缩进错误,因此很难知道应该在哪里。希望这是有帮助的

您可以使用
numpy.loadtext(文件名)
。例如,如果这是您的数据库
.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 |
您需要
名称
列:

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

上下文:对于这种类型的工作,您应该使用令人惊叹的pythonpetl库。这将为您节省大量的工作和使用标准csv模块“手动”操作时可能遇到的挫折。顺便说一句,仍然使用csv模块的人只有那些还没有找到更好的工具来处理表格数据的人(熊猫、petl等),这很好,但是如果你计划在职业生涯中处理来自各种奇怪来源的大量数据,学习类似petl的东西是你能做的最好的投资之一。在完成pip安装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')
通过,您可以使用With
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

要获取列名,请不要使用readlines()最好使用readline()以避免循环读取完整文件并将其存储在数组中

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

    # get number of columns

    line = csvfile.readline()

    first_item = line.split(',')
使用:

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

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

顺便说一句,我只是用一种简单的方式把别人说的话汇总起来。实际答案取自和。

由于您可以索引和子集pandas数据帧,将csv文件中的单个列提取到变量中的一种非常简单的方法是:

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

需要考虑的几件事:

上面的代码片段将生成一个
系列
,而不是
数据帧
。 如果速度是一个问题,ayhan使用
usecols
的建议也会更快。 在大小为2122 KB的csv文件上使用
%timeit
测试这两种不同的方法,usecols方法的测试结果为
22.8 ms
,而我建议的方法的测试结果为
53 ms


不要忘了
导入熊猫作为pd

如果需要单独处理列,我喜欢使用
zip(*iterable)
模式(有效地“解压”)来解构列。以你为例:

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

我认为有一个更简单的方法

import pandas as pd

dataset = pd.read_csv('table1.csv')
ftCol = dataset.iloc[:, 0].values
因此在这里,
iloc[:,0]
表示所有值,
0
表示列的位置。 在下面的示例中,将选择
ID


为什么
'rb'
标记为
open()
?它不应该是简单的
r
?@Elazar:python2(OP正在使用)中的
“rb”
适合传递给
csv.reader
。为什么示例csv文件将管道字符显示为分隔符,而示例代码使用空格?@KellyS.French我认为这有助于实现此问题的数据可视化。@G“filepath\name.csv”旁边是否应该有一个r?是否可以删除查询中的索引号@Ryan SaxeYes,在for循环中迭代一下。我认为Pandas是一个完全可以接受的解决方案。我经常使用熊猫,也很喜欢图书馆,但这个问题特别提到了CSV模块。@frankV好吧,标题、标签和第一段并没有以任何方式禁止熊猫,AFAI可以看到。实际上,我只是希望在这里已经给出的答案基础上添加一个更简单的答案(其他答案也使用pandas)。您必须先
pip安装pandas
import pandas as pd 
csv_file = pd.read_csv("file.csv") 
column_val_list = csv_file.column_name._ndarray_values
import pandas as pd

dataset = pd.read_csv('table1.csv')
ftCol = dataset.iloc[:, 0].values
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
SAMPLE.CSV
a, 1, +
b, 2, -
c, 3, *
d, 4, /
column_names = ["Letter", "Number", "Symbol"]
df = pd.read_csv("sample.csv", names=column_names)
print(df)
OUTPUT
  Letter  Number Symbol
0      a       1      +
1      b       2      -
2      c       3      *
3      d       4      /

letters = df.Letter.to_list()
print(letters)
OUTPUT
['a', 'b', 'c', 'd']