参考文献:《Python数据分析基础》
前言
在读写单个Excel文件时,常常希望输出文件的格式与原文件相同。例如在之前提到的,希望输出文件中的日期格式如之前一样,为了避免之前的问题,可以使用xlrd修改日期格式,使他们看上去与输入的Excel文件一样。
创建脚本
#!/usr/bin/env python3
import sys
from datetime import date
from xlrd import open_workbook, xldate_as_tuple
from xlwt import Workbook
input_file = sys.argv[1]
output_file = sys.argv[2]
output_workbook = Workbook()
output_worksheet = output_workbook.add_sheet('jan_2013_output')
with open_workbook(input_file) as workbook:
worksheet = workbook.sheet_by_name('january_2013')
for row_index in range(worksheet.nrows):
row_list_output = []
for col_index in range(worksheet.ncols):
if worksheet.cell_type(row_index, col_index) == 3:
date_cell = xldate_as_tuple(worksheet.cell_value(row_index, col_index),workbook.datemode)
date_cell = date(*date_cell[0:3]).strftime('%m/%d/%Y')
row_list_output.append(date_cell)
output_worksheet.write(row_index, col_index, date_cell)
else:
non_date_cell = worksheet.cell_value(row_index,col_index)
row_list_output.append(non_date_cell)
output_worksheet.write(row_index, col_index, non_date_cell)
output_workbook.save(output_file)
脚本代码注释
row_list_output = []
这一行代码创建了一个空列表,用于存储每行的元素。小编认为,可以省略这一行代码,但还未找到最好的解释。
if worksheet.cell_type(row_index, col_index) == 3:
date_cell = xldate_as_tuple(worksheet.cell_value(row_index, col_index),workbook.datemode)
date_cell = date(*date_cell[0:3]).strftime('%m/%d/%Y')
row_list_output.append(date_cell)
output_worksheet.write(row_index, col_index, date_cell)
这部分代码创建了if的控制流语句来检验单元格类型是否为3。单元格类型为3代表该单元格包含日期数据。换句话来说,如果当下单元格为日期类型数据,那么就进行if语句下的操作。
xldate_as_tuple函数可以将Excel表格中代表日期,时间或者日期时间的数值转换为元组。只要将数值转换成了原组并将时间元素格式化成不同的时间格式。在这里简单介绍一下xldate_as_tuple函数原型。
xldate_as_tuple(date_value, datemode)
第一个参数为该单元格的时间数据,第二个参数是是时间基准,它可以使函数确定是基于1900年还是基于1904年,并据此将数值转换成正确的元组。
第三行代码中,引用data函数,将前面处理过的这些值转换成一个date对象。这里简单说一下,date对象包含了年月日,但不包含时分秒。相反,datetime函数创建的对象则包含时间元素。引用strftime函数将date函数转换为一个具有特定格式的字符串。
else:
non_date_cell = worksheet.cell_value(row_index,col_index)
row_list_output.append(non_date_cell)
output_worksheet.write(row_index, col_index, non_date_cell)
与if语句相对的,else下的语句块则是处理非时间类型的单元格。
运行代码
在命令行输入以下命令,然后按回车键: