Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 .xlsx到csv,包括更改数字格式和验证数据_Python 2.7_Loops_Csv_Utf 8_Number Formatting - Fatal编程技术网

Python 2.7 .xlsx到csv,包括更改数字格式和验证数据

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编码(编码

我一直在做一个验证.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是否有一种方法可以迭代其数据并更改其值(我在两个库的文档中都找不到任何内容)?或者可能有一个更强大的库来满足我的情况

请开导我

代码示例:

    # 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
方法。