[英]Python read csv file columns into lists, ignoring headers
我有一个文件“data.csv”,看起来像
ColA, ColB, ColC
1,2,3
4,5,6
7,8,9
我想打开文件列并将其读入列表,省略该列表的第一个条目,例如
dataA = [1,4,7]
dataB = [2,5,8]
dataC = [3,6,9]
实际上有超过 3 列并且列表很长,这只是格式的一个示例。 我试过:
csv_file = open('data.csv','rb')
csv_array = []
for row in csv.reader(csv_file, delimiter=','):
csv_array.append(row)
然后我会将csv_array
每个索引分配给一个列表,例如
dataA = [int(i) for i in csv_array[0]]
但我收到错误:
_csv.Error: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?
也感觉像是将数据保存到几个列表的一种非常冗长的方式......
谢谢!
编辑:
这是我解决它的方法:
import pandas as pd
df = pd.read_csv('data.csv', names = ['ColA','ColB','ColC']
dataA = map(int,(df.ColA.tolist())[1:3])
并重复其余的列。
为了向试图解决类似问题的人们说明这一点,也许没有 Pandas,这里有一个简单的带有注释的重构。
import csv
# Open the file in 'r' mode, not 'rb'
csv_file = open('data.csv','r')
dataA = []
dataB = []
dataC = []
# Read off and discard first line, to skip headers
csv_file.readline()
# Split columns while reading
for a, b, c in csv.reader(csv_file, delimiter=','):
# Append each variable to a separate list
dataA.append(a)
dataB.append(b)
dataC.append(c)
这对将单个字段转换为数字没有任何作用append(int(a))
如果需要,可以使用append(int(a))
等),但希望应该足够明确和灵活,以向您展示如何使其适应新的要求。
使用熊猫:
import pandas as pd
df = pd.DataFrame.from_csv(path)
rows = df.apply(lambda x: x.tolist(), axis=1)
要跳过标题,请在单独的行上创建您的阅读器。 然后要将行列表转换为列列表,请使用zip()
:
import csv
with open('data.csv', 'rb') as f_input:
csv_input = csv.reader(f_input)
header = next(csv_input)
data = zip(*[map(int, row) for row in csv_input])
print data
给你:
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
所以如果需要:
dataA = data[0]
好像您的 csv 文件中有 OSX 行结尾。 尝试将 csv 文件保存为“Windows 逗号分隔 (.csv)”格式。
还有一些更简单的方法可以使用 csv 阅读器执行您正在执行的操作:
csv_array = []
with open('data.csv', 'r') as csv_file:
reader = csv.reader(csv_file)
# remove headers
reader.next()
# loop over rows in the file, append them to your array. each row is already formatted as a list.
for row in reader:
csv_array.append(row)
然后您可以设置dataA = csv_array[0]
首先,如果您使用 csv.reader(csv_file, delimiter=',') 读取 csv 文件,您仍将读取标题。
csv_array[0] 将是标题行 -> ['ColA', 'ColB', 'ColC']
此外,如果您使用的是 mac,这里已经引用了这个问题: CSV new-line character seen in unquoted field error
如果您将使用数据进行更多分析,我会建议您使用 pandas&numpy。 它将 csv 文件读取到 Pandas 数据帧。 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
使用csv.DictReader()
选择特定列
dataA = []
dataB = []
with open('data.csv', 'r') as csv_file:
csv_reader = csv.DictReader(csv_file, delimiter=',')
for row in csv_reader:
dataA.append(row['ColA'])
dataB.append(row['ColB'])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.