假設我有這樣一個文本文件的行象下面這樣:蟒蛇:讀表中的每一列轉換爲正確的數據類型
3, 4.32, hi
7, 3.23, hello
當我在這個文件中讀取,所有參賽作品將被視爲字符串。有沒有辦法讓它們自動轉換(在我的例子中)爲int,float和string?
假設我有這樣一個文本文件的行象下面這樣:蟒蛇:讀表中的每一列轉換爲正確的數據類型
3, 4.32, hi
7, 3.23, hello
當我在這個文件中讀取,所有參賽作品將被視爲字符串。有沒有辦法讓它們自動轉換(在我的例子中)爲int,float和string?
一個原始的方法:
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)
所以這基本上工作,因爲一個int轉換比一個float轉換更具限制性,比str轉換更具限制性? – qua
你已經有了'str'(幾乎沒有任何操作) - 所以最後一次...'float'會吞下'int',所以它會在'float'之前...因此,基本上是。如果你知道它們應該是什麼類型 - 這是一個更好的方法,否則,通常你會使用這種排序... –
@qua我也放了一個選項,使用'ast.literal_eval'這是可能更好 –
如果所有文件中存在固定模式,則使用另一個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()
如果你事先知道你可以做到這一點的類型:
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)]
你知道的模式始終是'int','float','str'?或者你是否試圖讓它們自動轉換爲「有意義」? –
你是什麼意思自動? – Amyth
我的意思是你可以假定每列都有相同的「真」數據類型,但我想爲多個文本文件做這個。 – qua