我正在使用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}}并将其余部分保留原样?
提前致谢。
答案 0 :(得分:2)
根据xlrd docs,Excel XL_CELL_NUMBER
将转换为Python float类型。
我认为这是你的int值转换为浮点数的原因。
答案 1 :(得分:0)
如果存在仅具有int值而不是浮点数的特定列,则必须在保存为CSV之前将这些列转换为该类型。日期也是如此,因为它们也存储为浮点数。
答案 2 :(得分:0)
首先使用Excel或LibreOfficeCalc打开xlsx文件并格式化包含数字的单元格:
我的解决方案使用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