我正在尝试解析csv文件并仅从特定列中提取数据.
示例csv:
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Run Code Online (Sandbox Code Playgroud)
我想只捕获特定的列,也就是说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
Run Code Online (Sandbox Code Playgroud)
而且我希望这会打印出我想要的每一行的特定列,除非它没有,我只得到最后一列.
Rya*_*axe 168
你会得到从这个代码的最后一列的唯一方法是,如果你不包括你的print语句中的for
循环.
这很可能是代码的结束:
for row in reader:
content = list(row[i] for i in included_cols)
print content
Run Code Online (Sandbox Code Playgroud)
你希望它是这样的:
for row in reader:
content = list(row[i] for i in included_cols)
print content
Run Code Online (Sandbox Code Playgroud)
既然我们已经解决了您的错误,我想借此机会向您介绍一下pandas模块.
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']
Run Code Online (Sandbox Code Playgroud)
因此,如果您想将列中的所有信息保存Names
到变量中,这就是您需要做的:
names = df.Names
Run Code Online (Sandbox Code Playgroud)
这是一个很棒的模块,我建议你研究一下.如果由于某种原因你的print语句是for
循环的,它仍然只打印出最后一列,这不应该发生,但如果我的假设是错误的,请告诉我.您发布的代码有很多缩进错误,因此很难知道应该在哪里.希望这有用!
Hen*_*nyH 99
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'])
Run Code Online (Sandbox Code Playgroud)
用像这样的文件
name,phone,street
Bob,0893,32 Silly
James,000,400 McHilly
Smithers,4442,23 Looped St.
Run Code Online (Sandbox Code Playgroud)
会输出
>>>
['Bob', 'James', 'Smithers']
['0893', '000', '4442']
['32 Silly', '400 McHilly', '23 Looped St.']
Run Code Online (Sandbox Code Playgroud)
或者,如果您想要列的数字索引:
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']
Run Code Online (Sandbox Code Playgroud)
要更改分隔符,请添加delimiter=" "
到适当的实例化,即reader = csv.reader(f,delimiter=" ")
Vas*_*kov 25
使用熊猫:
import pandas as pd
my_csv = pd.read_csv(filename)
column = my_csv.column_name
# you can also use my_csv['column_name']
Run Code Online (Sandbox Code Playgroud)
在分析时丢弃不需要的列:
my_filtered_csv = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])
Run Code Online (Sandbox Code Playgroud)
PS我只是以简单的方式汇总其他人所说的内容.实际答案取自此处和此处.
ayh*_*han 17
随着熊猫,你可以使用read_csv
带有usecols
参数:
df = pd.read_csv(filename, usecols=['col1', 'col3', 'col7'])
Run Code Online (Sandbox Code Playgroud)
例:
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
Run Code Online (Sandbox Code Playgroud)
G M*_*G M 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 |
Run Code Online (Sandbox Code Playgroud)
你想要的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')
Run Code Online (Sandbox Code Playgroud)
您可以更轻松地使用genfromtext
:
b = np.genfromtxt(r'filepath\name.csv', delimiter='|', names=True,dtype=None)
>>> b['Name']
array([' Adam ', ' Carl ', ' Adolf ', ' Den '],
dtype='|S7')
Run Code Online (Sandbox Code Playgroud)
上下文:对于这种类型的工作,您应该使用惊人的python petl库。通过标准的csv模块“手动”执行操作,可以节省大量工作和潜在的挫败感。AFAIK,唯一仍在使用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')
Run Code Online (Sandbox Code Playgroud)
我认为有一个更简单的方法
import pandas as pd
dataset = pd.read_csv('table1.csv')
ftCol = dataset.iloc[:, 0].values
Run Code Online (Sandbox Code Playgroud)
所以在这里iloc[:, 0]
,:
表示所有值,0
表示列的位置。在下面的例子ID
中将被选中
ID | Name | Address | City | State | Zip | Phone | OPEID | IPEDS |
10 | C... | 130 W.. | Mo.. | AL... | 3.. | 334.. | 01023 | 10063 |
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
491792 次 |
最近记录: |