将string更改为在导入的.csv中浮动

快速的问题,我没有设法快速解决的问题:

我正在处理.csv文件,似乎无法find将string转换为浮点的简单方法。 这是我的代码,

import csv def readLines(): with open('testdata.csv', 'rU') as data: reader = csv.reader(data) row = list(reader) for x in row: for y in x: print type(float(y)), readLines() 

正如你所看到的,它将在variables行的x组列表中的每一个y元素中打印出一个types; 这会产生一个很长的"<type 'float'>" 。 但是这实际上并没有将每个元素都改变为一个float,也没有设置for循环来执行float(y) (typestesting返回每个元素的“string”)。

我也尝试了literal_eval,但也失败了。 将列表元素更改为浮动的唯一方法是创build一个新的列表,可以使用列表理解或手动创build,但是会丢失每个列表的原始格式(作为一个较大列表中一组元素的列表)。

我想整个问题实际上只是“使用Python以.csv或excel格式读取,组织和综合数据的最简单方法是什么?

提前感谢那些彬彬有礼的/有足够的知识,以帮助。

你是正确的,内置csv模块在处理混合数据types时是非常原始的,在导入时进行所有的types转换,甚至在这个选项菜单上有一个非常严格的选项,这将破坏大多数真实世界的数据集(不一致在Booleans和因素中引用和转义,缺失或不完整的值,不匹配的Unicode编码导致字段内的幻影引号或转义字符,不完整的行将导致exception)。 修复csv导入是pandas无数的好处之一。 所以,你的最终答案确实是停止使用内置的CSV导入,并开始使用pandas。 但是让我们从你的问题的文字回答开始。

首先你问“如何将string转换为浮动,在CSV导入” 。 答案就是根据csv文档打开csv.reader(..., quoting=csv.QUOTE_NONNUMERIC)

csv.QUOTE_NONNUMERIC:指示阅读器将所有非引用字段转换为floattypes。

如果将所有未加引号的字段(整型,浮点型,文本型,布尔型等)都转换为浮点型(这通常是一个糟糕的主意,原因很多)(布尔值中的缺失或NA值或因素将被静默压制) 。 而且它显然会在未引用的文本字段上失败(抛出exception)。 所以这是脆弱的,需要try..catch保护。

然后你问: “我想整体问题实际上就是”使用Python以.csv或excel格式读取,组织和综合数据的最简单方法是什么?“” csv.reader解决scheme使用csv.reader(..., quoting=csv.QUOTE_NONNUMERIC)打开csv.reader(..., quoting=csv.QUOTE_NONNUMERIC)

但@geoffspear正确地回答说: “你的”整体问题“的答案可能是”大pandas“,尽pipe它有点模糊。

尝试如下所示

 import csv def read_lines(): with open('testdata.csv', 'rU') as data: reader = csv.reader(data) for row in reader: yield [ float(i) for i in row ] for i in read_lines(): print(i) # to get a list, instead of a generator, use xy = list(read_lines()) 

至于最简单的方法,那么我build议你看看xlrdxlwt模块,个人来说我总是很难用各种各样的CSV格式。

将一串string转换为浮点数时,应使用try / catch来捕获错误:

 def conv(s): try: s=float(s) except ValueError: pass return s print [conv(s) for s in ['1.1','bls','1','nan', 'not a float']] # [1.1, 'bls', 1.0, nan, 'not a float'] 

请注意,无法转换的string只是简单地传递。

一个csv文件是一个文本文件,所以你应该使用类似的function:

 def readLines(): def conv(s): try: s=float(s) except ValueError: pass return s with open('testdata.csv', 'rU') as data: reader = csv.reader(data) for row in reader: for cell in row: y=conv(cell) # do what ever with the single float # OR # yield [conv(cell) for cell in row] if you want to write a generator... 

得到它了:

 def read_lines2(): with open('testdata.csv', 'rU') as data: reader = csv.reader(data) for row in reader: new = [float(x) for x in row if x != ''] read_lines2() 

让我知道是否还有可以改进的地方 – 谢谢!

 for y in x: print type(float(y)), 

float(y)取y的值并返回一个基于它的float值。 它不修改y-它返回一个新的对象。

y = float(y)

更像是你在找什么 – 你必须修改对象。