猜测当前作为字符串表示的数据类型的方法

4 投票
5 回答
5218 浏览
提问于 2025-04-16 00:19

我现在正在处理CSV表格,想要找出每一列的数据类型。不过我并不知道这些值的具体格式。显然,CSV解析器输出的所有内容都是字符串。我现在关注的数据类型有:

  1. 整数
  2. 浮点数
  3. 日期
  4. 布尔值
  5. 字符串

我现在的想法是测试一些行(可能几百行吧?),通过模式匹配来确定里面的数据类型。

我特别担心日期这种数据类型——有没有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
>>>

撰写回答