非常类似于问题:Convert Python list of strings into floats, where list also contains words
除了我有一个2维列表(列表列表),结构是可预测的。
aa,3,250
bb,2,225
cc,4,275
dd,2.5,200
第一列总是填充字符串,应该保持不变。我试图将其余的列表转换为浮点数供以后使用。
import csv
data = open('import.csv', 'r')
catdata = csv.reader(data,delimiter=',')
cats = []
for row in catdata:
cats.append(row)
#trying to do the conversion here
cats = cats[:1] + [map(float, x) for x in cats[1:]]
numrowcats = len(cats)
for i in xrange(numrowcats):
sol=cats[i][1]+cats[i][2]
print sol
这是错误:
File "theworldneedsmorecats.py", line 12, in <module>
cats = cats[:1] + [map(float, x) for x in cats[1:]]
ValueError: could not convert string to float: bb
好像我已成功跳过第一个字符串,它现在挂在第二个字符串“bb”上。
如果我删除转换行,我会得到:
3250
2225
4275
2.5200
问题:是否有办法调整逻辑以将数字转换为浮点数而忽略第0列中的字符串?这可以用尽可能少的开销来完成吗?由于这是导入的,是否有一种“更聪明”的方式以正确的格式导入它们?
编辑:以下作品,谢谢 -
import csv
data = open('import.csv', 'r')
catdata = csv.reader(data,delimiter=',')
cats = []
#the line below appends AND casts data from the csv
cats = [c[:1] + map(float, c[1:]) for c in catdata]
print (cats)
print cats[0][0]
和输出:
[['aa', 3.0, 250.0], ['bb', 2.0, 225.0], ['cc', 4.0, 275.0], ['dd', 2.5, 200.0]]
aa
答案 0 :(得分:3)
问题是你的数组中的第一个元素不是第一列,而是第一行。这样你的行
cats = cats[:1] + [map(float, x) for x in cats[1:]]
尝试将除第一行行中的元素之外的所有元素转换为float,但失败。
相反,您可以在将各行添加到catdata
时进行转换。您可以在一行中将其作为列表解析来执行此操作,将此for row in catdata
循环替换为:
>>> cats = [c[:1] + map(float, c[1:]) for c in catdata]
>>> print(cats)
[['aa', 3.0, 250.0],
['bb', 2.0, 225.0],
['cc', 4.0, 275.0],
['dd', 2.5, 200.0]]
答案 1 :(得分:0)
这就是我提出的:
import csv
data = open('import.csv', 'r')
catdata = csv.reader(data,delimiter=',')
cats = []
for row in catdata:
cats.append(row)
catsNoFirstColumn = [cats[i][1:] for i in range(len(cats))]
catsFloat = [map(float, catsNoFirstColumn[i]) for i in range(len(catsNoFirstColumn))]
给你:
[[3.0, 250.0], [2.0, 225.0], [4.0, 275.0], [2.5, 200.0]]
答案 2 :(得分:0)
可能有像这里的代码。请注意这只适用于您的示例案例。逻辑很简单。它只引用非数字字符,然后使用csv.reader。
import csv
import StringIO
import re
convertedText = re.sub(r'([^\d,.\n]+)', r'"\1"', open("import.csv").read())
fp = StringIO.StringIO(convertedText)
reader = csv.reader(fp, delimiter=",", quoting=csv.QUOTE_NONNUMERIC)
for line in reader:
print line
输出:
['aa', 3.0, 250.0]
['bb', 2.0, 225.0]
['cc', 4.0, 275.0]
['dd', 2.5, 200.0]
答案 3 :(得分:0)
如果你真的想要一份清单:
data=[]
with open(fn, 'r') as fin:
for row in csv.reader(fin):
data.extend([[row[0]]+[float(e) for e in row[1:]]])
结果:
[['aa', 3.0, 250.0], ['bb', 2.0, 225.0], ['cc', 4.0, 275.0], ['dd', 2.5, 200.0]]
但在我看来,这些数据确实想成为一本字典:
data={}
with open(fn, 'r') as fin:
for row in csv.reader(fin):
data[row[0]]=[float(e) for e in row[1:]]
数据结果如下:
{'dd': [2.5, 200.0], 'cc': [4.0, 275.0], 'bb': [2.0, 225.0], 'aa': [3.0, 250.0]}
然后你可以像这样访问元素:
>>> data['dd']
[2.5, 200.0]