使用Python从csv文件中提取变量名和数据
我有一个csv文件,它的每一行都用行名和11条数据格式化。下面是一条线的示例使用Python从csv文件中提取变量名和数据,python,csv,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'd
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]
因此,这将是理想的最终解决方案。如果让文件的输出以另一种格式读取更容易,并且被认为更好,我当然可以重新编写我的工具来处理该数据类型 对于这类事情(动态变量),您需要使用
dict
:
dicts
对于动态变量特别有用,是存储此类内容的最佳方法。要访问,您只需使用:
data['CW1']
此解决方案还意味着,如果您在中添加任何具有新名称的额外行,则无需更改任何内容
如果您非常希望变量名位于全局名称空间中,而不在目录中,请使用exec
(注意:如果其中任何一个使用来自外部源的输入,则使用exec
/EVAL
可能非常危险(rm*
级别)因此,确保所有输入都由您自己控制和理解)
在python中,可以使用切片:row[1://code>将包含除第一个元素之外的行,因此可以执行以下操作:
>>> 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]}
关于变量,请检查或。不过我还是会坚持使用字典。正如Scironic在他们的回答中所说的,最好使用dict
但是,请注意,dict
对象没有任何“顺序”-如果使用一个,行的顺序将丢失。如果这是一个问题,您可以使用一个OrderedDict
(听起来就是这样的:一个dict
,它“记住”内容的顺序):
现在,如果在数据对象中循环,内容的顺序将与csv文件中的顺序相同:
for d in data.values():
myspecialtool(*d)
使用正确的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()。产生一个列表列表。这取决于第一列有多重要?感谢您的宝贵见解。如果我有必要的代表,我会投赞成票。@user3365779你有;-)感谢您关注订购问题。那确实帮我省去了一些头痛。
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)
for d in data.values():
myspecialtool(*d)
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