在将convertir xlsx转换为csv时,Python xlrd保存浮点数而不是整数

时间:2014-02-05 10:29:07

标签: python int xlrd

我正在使用xlrd来读取.xlsx文件并将其保存到.csv文件中。一切正常,问题是int文件的所有.xlsx值都会在float文件上自动转换为.csv。这意味着,如果我在40文件的单元格内部有.xlsx,则40.0文件中的.csv显示为.csv

我使用以下代码读取并将其转换为 wb = xlrd.open_workbook('share\docs\excelcontrol2.xlsx') sh = wb.sheet_by_name('Hoja1') archivo_csv = open('share\docs\output.csv', 'wb') wr = csv.writer(archivo_csv, delimiter=";") for rownum in xrange(sh.nrows): wr.writerow(sh.row_values(rownum)) archivo_csv.close()

xlsx

int文件包含float.csv等内容。如何保存int文件以保留原始格式?我的意思是,将float更改为{{1}}并将其余部分保留原样?

提前致谢。

3 个答案:

答案 0 :(得分:2)

根据xlrd docs,Excel XL_CELL_NUMBER将转换为Python float类型。

我认为这是你的int值转换为浮点数的原因。

答案 1 :(得分:0)

如果存在仅具有int值而不是浮点数的特定列,则必须在保存为CSV之前将这些列转换为该类型。日期也是如此,因为它们也存储为浮点数。

答案 2 :(得分:0)

首先使用Excel或LibreOfficeCalc打开xlsx文件并格式化包含数字的单元格:

  • 如果数字是int,则设置0小数,
  • 如果数字是浮点数,则设置至少1位小数。

我的解决方案使用openpyxl库。 在此库中,每个对象Cell都具有属性格式,该格式对应于之前设置的小数位数。读取此属性,我们将能够区分int和float。

以下是代码:

from openpyxl import load_workbook

def csv_from_excel(xlsx_file_path):
    """

    :param xlsx_file_path: String. Path of the excel file.

    Example :
    while calling csv_from_excel("one/two/my_file.xlsx"), the file "one/two/my_file.csv" is created.

    """

    file_name, extension = os.path.splitext(xlsx_file_path)
    csv_file_path = file_name + ".csv"
    wb = load_workbook(filename=xlsx_file_path)
    first_sheet = wb.get_sheet_names()[0]
    worksheet = wb.get_sheet_by_name(first_sheet)
    content = []
    for row in worksheet.iter_rows():
        my_row = []
        for cell in row:
            value = cell.internal_value
            the_format = cell.number_format
            if value_is_float_in_int_format(value, the_format):  # case when excel will gives 80 instead of 80.0
                value = float(value)
            my_row.append(value)
        content.append(my_row)
    write_csv_file(csv_file_path, content)


def value_is_float_in_int_format(value, the_format):
    result = isinstance(value, int)
    result = result and not (the_format == "General" or the_format == "0")
    return result


def write_csv_file(csv_file_path, content, delimiter=CSV_DEFAULT_DELIMITER):
    """

    :param csv_file_path: String. Path of the csv file to write on.
    :param delimiter: Char. Delimiter for the csv file (can be ';' ',' or '\t' for tab)
    :param content: List of List of String. Content to write in list of list.

    """
    logger.debug("FILE I/O : writing content in the file %s ", csv_file_path)
    with open(csv_file_path, "w") as a_file:
        writer = csv.writer(a_file, lineterminator='\n', delimiter=delimiter)
        writer.writerows(content)


my_xlsx_file = "/home/session/Documents/my_file.xlsx"
csv_from_excel(my_xlsx_file)  # this creates the csv file