猜测当前作为字符串表示的数据类型的方法
我现在正在处理CSV表格,想要找出每一列的数据类型。不过我并不知道这些值的具体格式。显然,CSV解析器输出的所有内容都是字符串。我现在关注的数据类型有:
- 整数
- 浮点数
- 日期
- 布尔值
- 字符串
我现在的想法是测试一些行(可能几百行吧?),通过模式匹配来确定里面的数据类型。
我特别担心日期这种数据类型——有没有Python模块可以解析常见的日期格式(当然我知道不可能检测到所有的格式)?
那么整数和浮点数呢?
5 个回答
2
我现在感兴趣的数据类型是……
这些数据类型在CSV文件中是不存在的。CSV文件里的数据只有字符串,只有字符串,别的什么都没有。
测试一部分行
这并不能告诉你什么,只能告诉你你在样本中看到的内容。样本之后的下一行可能是一个看起来完全不同的字符串。
处理CSV文件的唯一方法就是写一些处理CSV的程序,这些程序假设了特定的数据类型并尝试进行转换。你无法“发现”CSV文件中的太多信息。
如果第一列应该是日期,你得自己看看这个字符串,弄清楚它的格式。它可能是任何东西,比如一个数字,或者是美国或欧洲格式的常规日期(比如1/1/10,根本无法知道这是美国格式还是欧洲格式)。
try:
x= datetime.datetime.strptime( row[0], some format )
except ValueError:
# column is not valid.
如果第二列应该是浮点数,你只能这样做。
try:
y= float( row[1] )
except ValueError:
# column is not valid.
如果第三列应该是整数,你只能这样做。
try:
z= int( row[2] )
except ValueError:
# column is not valid.
除了对每一行进行float
转换外,根本没有办法“发现”CSV中是否有浮点数字符串。如果某一行转换失败,那就说明这个文件是有人准备得不正确。
既然你必须进行转换才能看看是否可以转换,那不如直接处理这一行。这样更简单,而且一次就能得到结果。
别浪费时间去分析数据。问问那些创建数据的人,里面应该有什么。
5
ast.literal_eval()
可以处理简单的情况。
3
提到处理日期时,可以考虑使用Dateutil这个库。
对于整数和浮点数,你可以在一个尝试/异常的代码块中进行转换。
>>> f = "2.5"
>>> i = "9"
>>> ci = int(i)
>>> ci
9
>>> cf = float(f)
>>> cf
2.5
>>> g = "dsa"
>>> cg = float(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for float(): dsa
>>> try:
... cg = float(g)
... except:
... print "g is not a float"
...
g is not a float
>>>