2012-12-21 24 views
2

假设我有这样一个文本文件的行象下面这样:蟒蛇:读表中的每一列转换为正确的数据类型

3, 4.32, hi 
7, 3.23, hello 

当我在这个文件中读取,所有参赛作品将被视为字符串。有没有办法让它们自动转换(在我的例子中)为int,float和string?

+2

你知道的模式始终是'int','float','str'?或者你是否试图让它们自动转换为“有意义”? –

+0

你是什么意思自动? – Amyth

+0

我的意思是你可以假定每列都有相同的“真”数据类型,但我想为多个文本文件做这个。 – qua

回答

6

一个原始的方法:

def guess(text): 
    for t in text.split(','): 
     for typ in (int, float, str): 
      try: 
       yield typ(t) 
       break 
      except ValueError as e: 
       pass 

d = '3, 4.32, hi' 

print list(guess(d)) 
# [3, 4.32, ' hi'] 
# [<type 'int'>, <type 'float'>, <type 'str'>] 

但是 - 如果你知道的类型应该是什么,那么这比暴力破解这样好多了......

而且你可以利用ast库做一些可能更灵活的工作,在try/except机制上需要的命中更少(读取更容易一点,但需要预处理输入需要一点点工作)

def guess2(text): 
    from ast import literal_eval 
    tokens = (t.strip() for t in text.split(',')) 
    for token in tokens: 
     try: 
      token_value = literal_eval(token) 
      token_type = type(token_value) 
      yield token_value, token_type 
     except ValueError as e: 
      yield token, type(token) 
+0

所以这基本上工作,因为一个int转换比一个float转换更具限制性,比str转换更具限制性? – qua

+0

你已经有了'str'(几乎没有任何操作) - 所以最后一次...'float'会吞下'int',所以它会在'float'之前...因此,基本上是。如果你知道它们应该是什么类型 - 这是一个更好的方法,否则,通常你会使用这种排序... –

+0

@qua我也放了一个选项,使用'ast.literal_eval'这是可能更好 –

0

如果所有文件中存在固定模式,则使用另一个quickie。

def update_types(): 
    f = open("txtfile", "r") 
    reader = f.readlines() 
    for line in reader: 
     parts = line.split(',') 
     parts[0], parts[1] = int(parts[0]), float(parts[1]) 
     for part in parts: 
      print type(part) 
    f.close() 
1

如果你事先知道你可以做到这一点的类型:

import csv 
type_funcs = [int, float, str] 
with open('yourfile.csv', 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     typed_row = [func(val) for func, val in zip(type_funcs, row)]