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

我试图parsing通过一个CSV文件,并提取仅来自特定列的数据。

示例csv:

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中的所有项目。它没有。

以下是我迄今为止所做的:

 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循环中包含print语句。

这很可能是你的代码的结束:

 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模块。

大pandas对于处理csv文件来说是非常棒的,下面的代码将是读取csv并将整个列保存到一个variables中的全部内容:

 import pandas as pd df = pd.read_csv(csv_file) saved_column = df.column_name #you can also use df['column_name'] 

所以如果你想把列Names所有信息保存到一个variables中,这就是你所需要做的:

 names = df.Names 

这是一个很好的模块,我build议你看看。 如果由于某种原因,你的打印语句是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'] 

将deliminator的add delimiter=" "更改为合适的实例,即reader = csv.reader(f,delimiter=" ")

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

随着pandas,你可以使用usecols参数的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 

上下文:对于这种types的工作,你应该使用惊人的Python Petl库。 这将为您节省大量的工作,并且可以避免使用标准csv模块“手动”操作的可能性。 AFAIK,唯一仍然使用csv模块的人是那些还没有发现更好的工具来处理表格数据(pandas,petl等),这是好的,但如果你打算处理大量的数据你从各种奇怪的来源的职业生涯,学习像petl是最好的投资之一,你可以做。 开始之前只需要花费30分钟,你完成pip install petl。 文档非常好。

回答:假设您有一个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') 

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

 with open(csv_file, 'rb') as csvfile: # get number of columns line = csvfile.readline() first_item = line.split(',') 

使用pandas 。 最简单的解决scheme

 import pandas as pd my_csv = pd.read_csv(filename) column = my_csv.column_name # you can also use my_csv['column_name'] 

多一点记忆友好的解决scheme,如果你真的需要这些字节(在parsing时抛弃不需要的列):

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

PS我只是简单地汇总了其他人的说法。 实际的答案是从这里和这里采取的。