Python 在导入的.csv文件中将字符串更改为浮动
一个我未能迅速解决的问题的快速问题: 我正在处理一个.csv文件,似乎找不到一种简单的方法将字符串转换为浮点。这是我的密码Python 在导入的.csv文件中将字符串更改为浮动,python,string,csv,import,floating-point,Python,String,Csv,Import,Floating Point,一个我未能迅速解决的问题的快速问题: 我正在处理一个.csv文件,似乎找不到一种简单的方法将字符串转换为浮点。这是我的密码 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:
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()
如您所见,它当前将打印变量行中x组列表中每个y元素的类型;这将生成一长串的“
。但这实际上并不会将每个元素都更改为浮点,也不会将for循环设置为执行float(y)
(类型测试会为每个元素返回“string”)
我也尝试了文字评估,但也失败了。将列表元素更改为浮动的唯一方法是使用列表理解或手动创建新列表,但这会丢失每个列表的原始格式(作为一个较大列表中一定数量元素的列表)
我想整个问题实际上只是“使用Python读取、组织和合成.csv或excel格式数据的最简单方法是什么?”
提前感谢那些有礼貌/知识渊博的人提供帮助。试试下面的方法
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())
至于最简单的方法,那么我建议您查看
xlrd
,xlwt
模块,就我个人而言,我总是很难处理所有不同的CSV格式。当将一组字符串转换为浮点数时,您应该使用
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']
请注意,无法转换的字符串只是原封不动地传递
csv文件是文本文件,因此您应该使用类似的功能:
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...
float(y)接受y的值并基于它返回一个float。它不修改y-它返回一个新对象
y=浮动(y)
更像是您正在寻找的-您必须修改对象。您是正确的,Python的内置csv模块在处理混合数据类型方面非常原始,在导入时进行所有类型转换,甚至在导入时也有非常严格的选项菜单,这将损坏大多数真实世界的数据集(不一致的引号和转义、布尔值和因子中缺少或不完整的值、不匹配的Unicode编码导致字段中出现虚名引号或转义字符、不完整的行将导致异常)。修复csv导入是的无数好处之一。因此,您的最终答案确实是停止使用内置csv导入,开始使用pandas。但让我们从您问题的字面答案开始 首先,您询问了“如何在csv导入时将字符串转换为浮点数”。答案是根据 csv.QUOTE_NONNUMERIC:指示读取器转换所有非引号 要键入float的字段 如果您同意将所有不带引号的字段(整数、浮点、文本、布尔值等)转换为浮点值,那么这是可行的,因为很多原因(布尔值或因子中的缺失值或NA值将被静默压制),这通常是一个坏主意。此外,它将失败(抛出异常)显然,在没有引号的文本字段上。因此它很脆弱,需要使用
try..catch
进行保护
然后你问:“我想整个问题实际上只是“使用Python读取、组织和合成.csv或excel格式数据的最简单方法是什么?”
糟糕的csv.reader解决方案是使用csv.reader(…,quoting=csv.QUOTE\u非数字)
但正如@geoffspear正确回答的那样,“您的“总体问题”的答案可能是“熊猫”,尽管它有点模糊。”type不会更改变量的类型,它只返回变量的类型。一旦您将变量转换为浮点,您需要将其指定到位,可能您需要
y=float(y)
您的变量的答案“总体问题”可能是“熊猫”,虽然有点模糊。首先,您似乎会问“如何在csv导入时将字符串转换为浮点数”,然后您将其变形为“我想总体问题实际上只是”使用Python读取、组织和合成.csv或excel格式数据的最简单方法是什么?“‘这些问题完全不同(请参阅我的答案,了解真实世界的例子,了解原因),如果您特别要求我们使用导入csv
,答案与使用熊猫
不同。本质上,内置csv模块已损坏,不应用于包含一个或多个文本或分类字段的任何非玩具数据集。请使用熊猫。过了很长一段时间后,再回到这一点,其中一些已在sing pandas,这是我认为其他提问者应该首先看到的答案。谢谢@userNaN。是的,这是从10年来在Python、CSV builtin、pandas、R、Excel和其他语言/软件包中进行CSV数据导入的痛苦经验中提炼出来的。当你使用引号、转义和/或Unicode字段以及NAs时,它会变得无比痛苦.csv只是中断,您必须找到更好的。
for y in x:
print type(float(y)),