4

csvから多数の混合データ(文字列と数値)を読み取り、すべてをExcelファイルに書き込もうとしています。残念ながら、csv形式はテキストのみであるため、すべてがテキストとして書き込まれます。数値データを正しい形式で書き込むにはどうすればよいですか?これは私がこれまでに持っているコードです...

import xlwt, csv

wb = xlwt.Workbook()
ws = wb.add_sheet('testSheet')

sourceCSV = csv.reader(open('sourceCSVfile.csv', 'rb'), delimiter=",")

for rowi, row in enumerate(sourceCSV):
  for coli, value in enumerate(row):
      ws.write(rowi, coli, value)
wb.save('TEST.xls') 
4

1 に答える 1

5

どういうわけか、データに応じて、各フィールドにどのデータ型があるかを判別できる必要があります。

データの各列に同じデータ型がある場合は、次のように実行できます。

# 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")呼び出しによって例外が発生します。

于 2012-04-15T00:20:59.160 に答える