파이썬 스크립트의 빅데이터 읽기와 쓰기 Excel[1]

22196 단어 파이썬 스크립트
최근에 Excel을 사용해야 하는 수요가 있습니다.내 취향에 따라 데이터가 커졌을 거야!머리카락이 더 적어야 돼...

xls 및 xlsx 형식


xls는 마이크로소프트의 개인 파일 형식 표준으로 바이너리 방식으로 파일을 직접 저장한다. 최대 지원 줄 수는 65536줄, 열 수는 256열이다. xlsx는 Office Open XML 표준을 바탕으로 하는 형식으로 실질적으로 zip 압축 패키지로 파일을 저장한다. 확장자는 xlsx를 사용하고 압축 해제 소프트웨어로 압축 패키지 내용을 볼 수 있으며 최대 1048576줄, 16384열을 지원한다.

수요


내 손의 수요는 xlsx 형식으로만 사용되기 때문에 이 공유는 xlsx 형식과 관련이 있고 뒤에 있는 모든 코드는 데이터를 읽거나 쓰기만 할 뿐 칸의 스타일에 전혀 관심이 없다.
요구 사항 A: Excel 내용은 2가지입니다. 1.단일 sheet 20w 내 데이터 (적음) 2.여러 개의 sheet 각각sheet 5w 내의 데이터(다) 과정: Excel이 업로드된 후 시스템은 대장 조작을 하고 대장 결과를 제시한다.그러므로 내가 보기에는 3단계: 데이터 생성 Excel 준비 (시스템에 업로드)나는 이 Excel을 해석하고 이 데이터와 표의 기록을 대조한다.나의 결과와 시스템의 결과를 비교하기;
수요 B: Excel 내용: 단일sheet가 최대 제한(100w)을 초과하지 않는 과정: Excel이 업로드된 후 시스템 검사 내용, 오류 메모리 없음;그러므로 내가 보기에는 2단계: 데이터 생성 Excel(시스템에 업로드)을 준비한다.나는 이 Excel을 분석하여 라이브러리에서 표의 데이터를 읽고 비교하여 각 기록의 정확성과 완전성을 확보한다
일반적으로 내가 만든 데이터의 양은 대략 100w, Excel은 대략 60M이다. 만약 한 번만 읽는다면 나는 실제적으로 쓴 시간을 상관하지 않을 것이다.이러한 Excel을 여러 번 읽으면 Excel을 읽을 시간을 고려해야 합니다.나는 자료를 좀 찾았는데, 마지막으로 확실한 사고방식은 Excel을 CSV 파일로 바꾸는 것이다.스크립트를 통해 Excel이 읽은 데이터를 CSV 파일에 저장합니다. [모든 Excel의 내용은 제가 변경할 가능성이 0에 가깝습니다. 왜냐하면 다시 생성하는 것도 어려운 일이 아니기 때문입니다 = =]실제 스크립트를 실행할 때, 대응하는 CSV 파일이 있는지 먼저 찾고, -> 대응하는 CSV 파일을 읽고 데이터를 얻습니다.없음 -> Excel 데이터를 먼저 읽고 CSV 파일을 새로 생성한 다음 해당 CSV 파일을 읽고 데이터를 가져옵니다.다음 단계로 넘어가겠습니다.

xlsx 형식의 읽기


필요 B: 단일 시트
    def get_excel_data(self, file):
        import xlrd
        all_data = list()

        Log.info(' Excel 。。。')

        book = xlrd.open_workbook(file)
        one_sheet = book.sheet_by_index(0)
        Log.info('sheet :{}'.format(book.sheet_names()))
        hang = range(0, one_sheet.nrows)
        for h in hang:
            ele = one_sheet.row_values(h)
            all_data.append((ele[0], ele[1], ele[2], ele[9], ele[10]))
            # all_data.append(ele)
            # all_data.append(tuple(ele))

        Log.info(all_data)                #    

all_data.append () 는 세 줄을 썼는데, 사실은 실제 사용할 필드와 필요한 형식을 보는 것이다.
필요 A: 다중 시트
    def get_excel_data_sssss(self, file):
        import xlrd
        Log.info(' Excel 。。。')

        book = xlrd.open_workbook(file)
        all_sheets = book.sheets()

        all_data = list()

        for s in all_sheets:
            s_index = all_sheets.index(s)

            sheet = book.sheet_by_name(s.name)
            Log.info('sheet:{}, {}'.format(sheet, s.name))

            if s_index == 0:
                hang = range(0, sheet.nrows)
                Log.info(' :{}'.format(hang))
            else:
                #    
                hang = range(1, sheet.nrows)
                Log.info(' :{}'.format(hang))

            for c in hang:
                if file.find('zyooooxie_csdn') != -1:
                    ele = sheet.row_values(c)
                    all_data.append((ele[1], ele[3], ele[8], ele[9], ele[10], ele[-1]))

                else:
                    ele = sheet.row_values(c)
                    all_data.append((ele[8], ele[3], ele[11], ele[0]))

            Log.info(' sheet  ')

        Log.info('Excel   ')
        Log.info(all_data)

xlsx 형식의 쓰기

    def insert_excel_new(self, all_data, header):
        """
        Excel  
        :param all_data:  list, list ( list sheet )
        :param header:  
        :return:
        """
        import xlsxwriter
        cur_time = time.strftime("_%Y%m%d_%H%M%S")
        w = r'D:\work\gys\test_' + cur_time + '.xlsx'

        workbook = xlsxwriter.Workbook(w, {'constant_memory': True})
        for abc in range(len(all_data)):

            sheet = workbook.add_worksheet(str(abc))
            all_data[abc].insert(0, header)
            
            Log.info('sheet {}  '.format(abc))
            
            for i in range(1, len(all_data[abc]) + 1):
                rc = ''.join(['A', str(i)])
                sheet.write_row(rc, data=all_data[abc][i - 1])
            
            Log.info(' sheet  ')

        workbook.close()

기존 데이터에 대한 Excel 추가


(xlutils를 이용해서 복사해서 저장하는 방식은 신뢰할 수 없습니다)
Excel_name = ‘test_20200516_150921.xlsx’
    def addExcelData(self, file, all_data):
        """
         sheet('test_zyooooxie') 
        :param file:  
        :param all_data: [ele1, ele2, ele3]
        :return:
        """
        import openpyxl
        import os
        Log.info(' Excel add')
        wb = openpyxl.load_workbook(file)

        # sheet_names = wb.get_sheet_names()
        # wb_sheet = wb.get_sheet_by_name(sheet_names[0])

        wb_sheet = wb.get_sheet_by_name('csdn_zyooooxie')

        for ABC in range(len(all_data)):
            wb_sheet.append(all_data[ABC])

        new_time = time.strftime("_%Y%m%d_%H%M%S")
        search_result = re.search(r'_2020\d{4}_([01]\d|2[0-4])([0-5]\d)([0-5]\d).xlsx$', os.path.basename(file))
        new_file = os.path.basename(file)[0:search_result.start()] + new_time + '.xlsx'

        w = ''.join([os.path.dirname(file), '\\', new_file])
        wb.save(w)

사실 이 공유는 내가 지금 어떻게 하고 있는지 말하는 것일 뿐이고, 다른 내가 기어다니는 구덩이는 두 번째 편에 놓여 있다.
커뮤니케이션 기술 환영+QQ 15312336zy 개인 블로그https://blog.csdn.net/zyooooxie

좋은 웹페이지 즐겨찾기