Python 2.7 .xlsx到csv,包括更改数字格式和验证数据
我一直在做一个验证.xlsx文件数据的小项目。每一列都有不同类型的数据,从数字到纯文本、日期等等 我想要完成的是打开一个.xlsx文件,更改数字格式(例如:通过应用Excel numformats(“@”表示字符串,“dd.mm.yyy”表示日期,“0”表示整数,“0.00”表示小数等),将数字从100.0更改为100)。在下一步中,我将通过迭代每个单元格amd字符(我将用字典替换字符)来验证每个列的数据,然后使用Utf-8编码将其保存为csv 目前,我正在使用xlrd模块以utf-8编码(编码\覆盖)打开.xlsx文件,然后使用xlsxwriter更改数字格式。问题是,我必须将更改的数据保存为.xlsx文件,然后再次使用xlrd重新打开它,对字符进行赋值,然后使用unicode csv模块将其保存为.csv。但是我想跳过再次保存文件的步骤,然后重新打开它。 我也尝试过openpyxl,但是打开“大”文件和操作数据需要很长时间 是否有任何方法将xlsxwriter工作簿类的数据返回到xlrd,或者xlsxwriter是否有一种方法可以迭代其数据并更改其值(我在两个库的文档中都找不到任何内容)?或者可能有一个更强大的库来满足我的情况 请开导我 代码示例:Python 2.7 .xlsx到csv,包括更改数字格式和验证数据,python-2.7,loops,csv,utf-8,number-formatting,Python 2.7,Loops,Csv,Utf 8,Number Formatting,我一直在做一个验证.xlsx文件数据的小项目。每一列都有不同类型的数据,从数字到纯文本、日期等等 我想要完成的是打开一个.xlsx文件,更改数字格式(例如:通过应用Excel numformats(“@”表示字符串,“dd.mm.yyy”表示日期,“0”表示整数,“0.00”表示小数等),将数字从100.0更改为100)。在下一步中,我将通过迭代每个单元格amd字符(我将用字典替换字符)来验证每个列的数据,然后使用Utf-8编码将其保存为csv 目前,我正在使用xlrd模块以utf-8编码(编码
# Opening .xlsx-File (xlrd)
input_file = open_workbook(curr_path + "/" + filename + '.xlsx', encoding_override="cp1252")</code><br>
# Creating the dictionaries for replace
def create_dicts(file_flag):
global dict_letters
global dict_numbers
global dict_special
global dict_control
global dict_greek
if file_flag <> 'sonstige':
dict_letters = create_dict("Buchstaben")
dict_numbers = create_dict("Zahlen")
dict_special = create_dict("Sonderzeichen")
dict_control = create_dict("Kontrollzeichen")
dict_greek = create_dict("Griechisch")
else:
dict_all = create_dict("All")
print "Dicts created"
def create_dict(ws):
keys =[]
values =[]
cell = ''
dict_xl_ws = ''
# Either create a dictionary containing all sheets or one for each sheet (depending on the parameter ws)
if ws == "All":
for curr_sheet in range(dict_xl_wb.nsheets):
dict_xl_ws = dict_xl_wb.sheet_by_index(curr_sheet)
for curr_row in range(dict_xl_ws.nrows):
for curr_col in [0,1]:
if str(dict_xl_ws.cell_value(curr_row, curr_col)) not in skip_list:
if curr_col == 0:
keys.append(str(dict_xl_ws.cell_value(curr_row, curr_col)).upper())
elif curr_col == 1:
values.append(str(dict_xl_ws.cell_value(curr_row, curr_col)).upper())
else:
dict_xl_ws = dict_xl_wb.sheet_by_name(ws)
for curr_row in range(dict_xl_ws.nrows):
for curr_col in [0,1]:
if str(dict_xl_ws.cell_value(curr_row, curr_col)) not in skip_list:
if curr_col == 0:
keys.append(str(dict_xl_ws.cell_value(curr_row, curr_col)).upper())
elif curr_col == 1:
values.append(str(dict_xl_ws.cell_value(curr_row, curr_col)).upper())
return dict(zip(keys,values))
# Calling the create_dicts() function
create_dicts(file_flag)
# Creating Workbook and Worksheet from class (xlsxwriter)
test = xlsxwriter.Workbook("test.xlsx")
test_ws = test.add_worksheet("TEST")
# Defining the number formats
text_format = test.add_format({'num_format': '@'})
integer_format = test.add_format({'num_format': '0'})
double_format = test.add_format({'num_format': '0.00'})
date_format = test.add_format({'num_format': 'DD.MM.YYYY'})
# Creating dictionary (key = start column; value = end column)
integer_dict = {0:1,4:5,8:9,16:16,19:19,25:26,28:29,33:33,35:35,42:42,44:46,48:49}
for key,value in integer_dict.iteritems():
# Applying the formats for each column in test_ws
test_ws.set_column(key, value,20, integer_format)
# After that I'd like to iterate through the data of xlsxwriter's workbook/worksheet class and change the data by replacing characters with those in the dictionaries. That part is already coded, but I need a proper library to work with
# Creating a csv-file to write the validated data into
output_file = codecs.open(curr_path + "/" + filename + '_OUT.csv','wb', encoding='utf-8')
正如@lenz正确指出的,XLRD有一种方法可以将单元格的值更改为excel日期。 因此,我使用xlrd.xldate.xldate作为_datetime()函数来更改该值。解决办法如下:
date_variable = xlrd.xldate.xldate_as_datetime(ws.cell_value(cell_row, cell_col), 0).strftime('%d.%m.%Y')
为了正确地将浮点数更改为整数,我使用了以下代码段:
integer_variable = '{0:g}'.format(Decimal(ws.cell_value(cell_row, cell_col)))
我希望这两条线能像帮助我一样帮助我 正如@lenz正确指出的,XLRD有一种方法可以将单元格的值更改为excel日期。 因此,我使用xlrd.xldate.xldate作为_datetime()函数来更改该值。解决办法如下:
date_variable = xlrd.xldate.xldate_as_datetime(ws.cell_value(cell_row, cell_col), 0).strftime('%d.%m.%Y')
为了正确地将浮点数更改为整数,我使用了以下代码段:
integer_variable = '{0:g}'.format(Decimal(ws.cell_value(cell_row, cell_col)))
我希望这两条线能像帮助我一样帮助我 我建议你完全跳过这本书。直接从xlrd获取的数据创建输出csv。使用Python的字符串格式化方法和
datetime.strftime()
等重新格式化数字和日期。感谢您的建议。是否没有一个库可以像excel一样更改数字格式,并且可以选择遍历其数据?问题是,例如,如果一个日期在excel中被格式化为一个数字,那么它可能看起来像“42857”。我认为strftime()函数无法将其格式化回“02.05.2017”。如果我没有记错,您可以告诉xlrd
单元格的内容是日期,它将返回datetime.date[time]
对象,而不是基础数字。然后您可以使用该对象的strftime
方法。我建议您完全跳过xlsxwriter。直接从xlrd获取的数据创建输出csv。使用Python的字符串格式化方法和datetime.strftime()
等重新格式化数字和日期。感谢您的建议。是否没有一个库可以像excel一样更改数字格式,并且可以选择遍历其数据?问题是,例如,如果一个日期在excel中被格式化为一个数字,那么它可能看起来像“42857”。我认为strftime()函数无法将其格式化回“02.05.2017”。如果我没有记错,您可以告诉xlrd
单元格的内容是日期,它将返回datetime.date[time]
对象,而不是基础数字。然后可以使用该对象的strftime
方法。