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

时间:2013-05-12 02:10:38

标签: python csv

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

示例csv:

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

我正在尝试仅捕获特定列,例如IDNameZipPhone

我看过的代码让我相信我可以通过相应的数字调用特定的列,因此:Name将对应2并使用{{1}遍历每一行将生成第2列中的所有项目。只有它不会。

这是我到目前为止所做的:

row[2]

我希望这会打印出我想要的每一行的特定列,除非它没有,我只得到最后一列。

12 个答案:

答案 0 :(得分:154)

从此代码中获取最后一列的唯一方法是,如果您未在<{1}}循环中包含打印语句

这很可能是代码的结尾:

for

你希望它是这样的:

for row in reader:
    content = list(row[i] for i in included_cols)
print content

现在我们已经解决了您的错误,我想借此机会向您介绍pandas模块。

Pandas对于处理csv文件非常引人注目,以下代码将是您阅读csv并将整个列保存到变量中所需的全部内容:

for row in reader:
        content = list(row[i] for i in included_cols)
        print content

因此,如果您想将列import pandas as pd df = pd.read_csv(csv_file) saved_column = df.column_name #you can also use df['column_name'] 中的所有信息保存到变量中,这就是您需要做的全部内容:

Names

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

答案 1 :(得分:95)

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=" ")

答案 2 :(得分:19)

使用pandas

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。我只是以简单的方式汇总其他人所说的内容。实际答案取自herehere

答案 3 :(得分:14)

使用pandas,您可以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

答案 4 :(得分:13)

您可以使用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')

答案 5 :(得分:5)

上下文:对于这种类型的工作,你应该使用惊人的python petl库。这将为您节省大量工作和潜在的挫败感,而不是手工制作。使用标准的csv模块。 AFAIK,唯一仍然使用csv模块的人是那些还没有发现更好的工具来处理表格数据(pandas,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')

答案 6 :(得分:5)

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

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 |

答案 7 :(得分:1)

import pandas as pd 
csv_file = pd.read_csv("file.csv") 
column_val_list = csv_file.column_name._ndarray_values

答案 8 :(得分:0)

要获取列名称,而不是使用 readlines(),最好使用 readline()来避免循环&amp;阅读完整的文件&amp;将其存储在数组中。

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

    # get number of columns

    line = csvfile.readline()

    first_item = line.split(',')

答案 9 :(得分:0)

感谢您可以为熊猫数据帧建立索引和子集的方法,一种非常简单的方法将csv文件中的单个列提取到变量中:

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

需要考虑的几件事:

上面的代码段将生成熊猫Series而不是dataframe。 如果速度是一个问题,ayhan的usecols的建议也会更快。 在大小为2122 KB的csv文件上使用%timeit测试这两种不同的方法,对于usecols方法来说是22.8 ms,对于我建议的方法来说是53 ms

别忘了import pandas as pd

答案 10 :(得分:0)

如果需要分别处理列,我想使用zip(*iterable)模式(有效地“解压缩”)来对列进行解构。因此,对于您的示例:

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

答案 11 :(得分:0)

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