どういうわけか、データに応じて、各フィールドにどのデータ型があるかを判別できる必要があります。
データの各列に同じデータ型がある場合は、次のように実行できます。
# 5 columns: text, integer, float, float, date in YYYY-MM-DD format
import datetime
def date_conv(s):
return datetime.datetime.strptime(s, "%Y-%m-%d")
converters = (str.strip, int, float, float, date_conv)
# use int if you want to check that it is an int.
# xlwt will convert the int to float anyway.
...
for rowi, row in enumerate(sourceCSV):
for coli, value in enumerate(row):
ws.write(rowi, coli, converters[coli](value))
その他の可能性:
(1)サック・イット・アンド・シーのアプローチ:
def float_if_possible(strg):
try:
return float(strg)
except ValueError:
return strg
...
ws.write(rowi, coli, float_if_possible(value))
(2)分析的アプローチ:
あなたはあなたのテキストを分析するために注意深く気の利いた正規表現を書く必要があります、そしてあなたはそれらを適切な順序で適用する必要があります。
フロートの場合、次のことを考慮してください。
float_const_pattern = r"""
[+-]? # optional sign
(?:
(?: \d* \. \d+ ) # .1 .12 .123 etc 9.1 etc 98.1 etc
|
(?: \d+ \. ) # 1. 12. 123. etc
|
(?: \d+ ) # 1 12 123 etc
)
# followed by optional exponent part
(?: [Ee] [+-]? \d+ ) ?
# followed by end of string
\Z # don't use $
"""
旗と一緒にre.VERBOSE
。特に「文字列の終わり」チェックに注意してください。そうしないと、入力が与えられる123qwerty
と、正規表現が一致123
し、float("123qwerty")
呼び出しによって例外が発生します。