将.csv文件中的混合数据写入带有xlwt的.xls - 如何格式化数字?

时间:2012-04-13 17:06:50

标签: python csv xlwt

我正在尝试从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') 

1 个答案:

答案 0 :(得分: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,正则表达式将匹配123float("123qwerty")调用将引发异常。