确定 CSV 的数据类型 - Python

2023-11-30

我是 Python 新手,在使用列表时遇到问题。

我公开了我的问题,如您所见,我有一个具有以下结构的 datos.csv 文件。

1,4.0,?,?,none,?
2,2.0,3.0,?,none,?
2,2.5,2.5,?,tc,39

使用此函数我将数据存储在列表中。

def main():
    lista = []
    with open('datos.csv','r') as f:
        for line in f:
           lista.append(line.strip().split(','))
    determinar_tipo(lista)

if __name__ == '__main__':
    main()

到目前为止,我没有任何问题。 然而,当我必须确定元素的类型时,问题就出现了。

使用此代码,我可以按列组织我的列表

for columna in itertools.izip(*lista):

这段代码允许我将数据视为列,如下所示,这是我从这个“for”中收到的示例:

  {'1','2','2'}
{'4.0','2.0','2.5'}
        .
        .
        .

正如您所看到的,与我的 csv 文件中的数据相同,但按列进行结构。

好吧,这是我的问题。

我必须根据每个列的参数确定其类型,也就是说,假设第一列 {'1', '2', '3'},检查第一个元素,该元素是该元素的类型列,在这种情况下,该列的类型将为 int。

另一个例子是 {'4.0', '2', '2.5'},我检查主元素的类型并确定它是浮点型。

对于这种情况{'?','?' , '?'} 类型将是“不确定的”。

但是,问题在于符号“?”,如果我得到这些符号,我必须检查该列的下一个元素,它将是名为“word”的元素,{“?”,“Word”, '5'},所以列的类型将是字符串。

这是我开发的代码来验证它,但我没有完成正确确定类型。

def determinar_tipo(lista):
  b = 0
  aux = []

  for columna in itertools.izip(*lista):
    if columna[0] != "?":   #If it's a number or string I save it
      aux.append(columna[0])
      print columna[0]
    else:                    #If it's '?'
      if len(columna) > b:
        b = b + 1
        if columna[b] != "?":
          aux.append(columna[b])
          b = 0
        else:
          b = b + 1
          print b
  #Correct code   
  for x in aux:
    try:
      var_type = type(int(x))
    except ValueError:
      try:
        var_type = type(float(x))
      except ValueError:
        var_type = type(x)
    print var_type

代码的第一部分负责将元素存储在另一个列表中以确定每一列的类型,而代码的第二部分负责检查前一个列表中每个元素的类型。

总之,我不知道如何使“for”返回正确的元素以正确检查列的类型。

这是我的数据的正确答案:

1  ,  4.0  ,   ?    ,      ?         ,   none   ,   ?
2  ,  2.0  ,  3.0   ,      ?         ,   none   ,   ?
2  ,  2.5  ,  2.5   ,      ?         ,    tc    ,   39
int  float   float     undetermined       string     int**

我更改了函数的名称,以便它们更有意义:

def determinar_tipo(valor):
    if valor == '?':
        return 'undetermined'
    try:
        int(valor)
    except ValueError:
        pass
    else:
        return int
    try:
        float(valor)
    except ValueError:
        return str
    else:
        return float

def determinar_tipos(lista):
    aux = []
    for columna in itertools.izip(*lista):
        i = 0
        while i < len(columna) and columna[i] == '?':
            i += 1
        aux.append(columna[i])
    for i, each in enumerate(aux):
        aux[i] = determinar_tipo(each)
    return aux
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定 CSV 的数据类型 - Python 的相关文章

随机推荐