读取CSV并按列分隔

时间:2012-06-20 18:37:42

标签: python list csv coordinate

全新的Python(以及一般的编程),如果这很简单和/或在我找不到的地方回答,请随时以典型的论坛方式骚扰我。

我有一堆CSV,每个包含10个XY坐标,如下所示:

10,5
2,4
5,6 
7,8
9,12
3,45
2,4
6,5
0,3 
5,6 

我希望将X坐标和Y坐标分成两个单独的列表,这样我就可以从给定列表中的每个值中减去一个值。例如,从X坐标列表中的每个值减去5,从Y坐标列表中的每个值减去3。然后我将获取每个值的abs()并找到最小值。一旦找到这些最小值,我想将这些列表一起添加,以便将每个值添加到它的对应

IE)如果X的绝对值类似于

4
5
....

和Y之类的东西

6
7
....

我想添加4和6,然后是5和7等。

要分开它们,我试过

import csv
filein = open("/path/here")
reader = csv.reader(filein, skipinitialspace = True)
listofxys = []
for row in reader:
    listofxys.append(row)

Xs = listofxys.pop(0) # to pop all the X's

Ys = listofxys.pop() # to pop all the Y's

但是它提供了第一个XY对,而不是所有的前导值。我在这里做错了什么?

最终的目标是找到最接近XY坐标的点,所以如果这是一个不好的方法,请随意引导我朝另一个方向前进。

提前致谢!

3 个答案:

答案 0 :(得分:5)

值得注意的是你应该尝试使用 the with statement 在Python中打开文件时。这更具可读性并且删除了 文件未被封闭的可能性(即使发生异常)。

你的实际问题在于你没有做你想做的事。

reader = csv.reader(filein, skipinitialspace = True)
listofxys = []
for row in reader:
    listofxys.append(row)

所有这一切都是reader = list(csv.reader(filein, skipinitialspace = True))以非常低效的方式。

您要做的是使用the zip() builtin获取对的列表并将其转换为两个列表。您可以使用星号运算符执行此操作:

import csv

with open("test") as filein:
    reader = csv.reader(filein, skipinitialspace = True)
    xs, ys = zip(*reader)

print(xs)
print(ys)

给出了:

('10', '2', '5', '7', '9', '3', '2', '6', '0', '5')
('5', '4', '6', '8', '12', '45', '4', '5', '3', '6')

请注意这些值是字符串的事实。如果您想将它们作为数字,则需要使用csv.QUOTE_NONNUMERIC,例如:reader = csv.reader(filein, quoting=csv.QUOTE_NONNUMERIC, skipinitialspace = True)

给出了:

(10.0, 2.0, 5.0, 7.0, 9.0, 3.0, 2.0, 6.0, 0.0, 5.0)
(5.0, 4.0, 6.0, 8.0, 12.0, 45.0, 4.0, 5.0, 3.0, 6.0)

答案 1 :(得分:1)

听起来您正在寻找zip功能,请在此处记录:

http://docs.python.org/library/functions.html#zip

答案 2 :(得分:1)

    import os,csv, numpy, scipy
    from numpy import *
    f= open('some.csv', 'rb') 
    reader = csv.reader(f, delimiter=',')
    header = reader.next()
    zipped = zip(*reader)
    print( zipped[1] ) # is the 2nd column of the csv file

HTH