使用Python从csv文件中提取变量名和数据

时间:2015-06-08 14:55:18

标签: python csv

我有一个csv文件,每行使用行名称格式化后跟11个数据。这是一个行的例子。

CW1,0,-0.38,2.04,1.34,0.76,1.07,0.98,0.81,0.92,0.70,0.64

总共有12行,每行都有唯一的名称和数据。

我想要做的是从每一行中提取第一个单元格并使用它来命名相应的数据,或者作为一个变量等于包含该行数据的列表,或者可以作为一个字典,第一个单元格是关键。

我是处理输入文件的新手,所以我得到的最远的是使用文档中的库存解决方案来读取文件

import csv

path = r'data.csv'

with open(path,'rb') as csvFile:
    reader = csv.reader(csvFile,delimiter=' ')
    for row in reader:
        print(row[0])

我没有弄清楚如何将每一行分配给一个新变量,特别是当我不确定变量名是什么时(这是因为csv文件将由我自己以外的用户创建)。

此数据的目的地是我编写的工具。它接受列表作为输入,例如......

CW1 = [0,-0.38,2.04,1.34,0.76,1.07,0.98,0.81,0.92,0.70,0.64]

所以这将是理想的最终解决方案。如果更容易,并且考虑更好地将文件的输出读取为另一种格式,我当然可以重新编写我的工具以使用该数据类型。

4 个答案:

答案 0 :(得分:3)

您需要使用dict来处理这些事情(动态变量):

import csv

path = r'data.csv'

data = {}

with open(path,'rb') as csvFile:
    reader = csv.reader(csvFile,delimiter=' ')
    for row in reader:
        data[row[0]] = row[1:]

dicts对动态变量特别有用,是存储此类内容的最佳方法。访问你只需要使用:

data['CW1']

此解决方案还意味着,如果您使用新名称添加任何额外的行,您将不必更改任何内容。

如果您迫切希望在global namespace而不是dict中使用变量名称,请使用exec(注意,如果此类使用从外部来源输入,请使用{{ 1}} / EXEC可能非常危险(EVAL级别)所以请确保所有输入都由您自己控制和理解。

rm *

答案 1 :(得分:3)

正如Scironic在回答中所说,最好使用dict来做这类事情。

但是,请注意dict个对象没有任何"顺序" - 如果使用行,则行的顺序将丢失。如果这是一个问题,您可以改为使用OrderedDict(这听起来就是这样的:dict"记住"其内容的顺序):

import csv
from collections import OrderedDict as od

data = od() # ordered dict object remembers the order in the csv file

with open(path,'rb') as csvFile:
    reader = csv.reader(csvFile, delimiter = ' ')
    for row in reader:
        data[row[0]] = row[1:] # Slice the row up into 0 (first item) and 1: (remaining)

现在,如果循环浏览data对象,内容的顺序与csv文件中的顺序相同:

for d in data.values():
    myspecialtool(*d)

答案 2 :(得分:0)

在python中,你可以使用切片:row[1:]将包含除第一个元素之外的行,所以你可以这样做:

>>> d={}
>>> with open("f") as f:
...  c = csv.reader(f, delimiter=',')
...  for r in c:
...    d[r[0]]=map(int,r[1:])
...
>>> d
{'var1': [1, 3, 1], 'var2': [3, 0, -1]}

关于变量变量,请检查How do I do variable variables in Python?How to get a variable name as a string in Python?。我会坚持使用字典。

答案 3 :(得分:0)

使用正确的csv库的替代方法如下:

path = r'data.csv'
csvRows = open(path, "r").readlines()

dataRows = [[float(col) for col in row.rstrip("\n").split(",")[1:]] for row in csvRows]

for dataRow in dataRows:        # Where dataRow is a list of numbers
    print dataRow

然后,您可以调用print语句所在的函数。

这将读取整个文件并生成带有尾随换行符的行列表。然后删除每个换行符并将每一行拆分为一个字符串列表。它会跳过初始列并为每个条目调用float()。导致列表列表。这取决于第一列的重要性?