Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีประมวลผลข้อมูล Excel แบบ Chunk ด้วย Python

บทนำ

ดูเหมือนโลกถูกควบคุมโดย Excel หลายองค์กรใช้ Excel เป็นเครื่องมือตัดสินใจสำคัญ แม้จะไม่ชอบ MS Office ก็ต้องจัดการไฟล์ Excel ขนาดใหญ่ได้อย่างมีประสิทธิภาพ

พื้นฐานการจัดการ Excel กับ Pandas

  1. ติดตั้ง openpyxl และ xlwt
  2. สร้างไฟล์ Excel ด้วย xlsxwriter
  3. อ่านเข้า Pandas DataFrame
  4. เขียน DataFrame กลับไป Excel

ฟังก์ชันสร้างไฟล์ Excel


import xlsxwriter

def write_data_to_files(inp_data, inp_file_name):
    workbook = xlsxwriter.Workbook(inp_file_name)
    worksheet = workbook.add_worksheet()
    row, col = 0, 0
    for player, titles in inp_data:
        worksheet.write(row, col, player)
        worksheet.write(row, col + 1, titles)
        row += 1
    workbook.close()

ฟังก์ชันอ่าน/เขียน Excel ด้วย Pandas


import pandas as pd

def excel_functions_with_pandas(inp_file_name):
    data = pd.read_excel(inp_file_name)
    print(data.head())
    print(data.info())
    
    # สร้าง Sheet2 ใหม่
    new_players_info = pd.DataFrame([...])
    new_data = pd.ExcelWriter(inp_file_name)
    new_players_info.to_excel(new_data, sheet_name="Sheet2")

ประมวลผล Excel แบบ Chunk (Pandas ไม่รองรับ chunks สำหรับ Excel โดย default)

โค้ดด้านล่างอ่าน Excel ทีละ chunk (เช่น 1000 แถว) โดยใช้ skiprows และ nrows


def global_excel_to_db_chunks(file_name, nrows):
    chunks = []
    i_chunk = 0
    skiprows = 1  # skip header
    df_header = pd.read_excel(file_name, nrows=1)
    
    while True:
        df_chunk = pd.read_excel(file_name, nrows=nrows, skiprows=skiprows, header=None)
        skiprows += nrows
        
        if not df_chunk.shape[0]:  # ไม่มีข้อมูล
            break
        else:
            print(f" ** Reading chunk number {i_chunk} with {df_chunk.shape[0]} Rows")
            chunks.append(df_chunk)
            i_chunk += 1
    
    df_chunks = pd.concat(chunks)
    # rename columns to match header
    columns = {i: col for i, col in enumerate(df_header.columns.tolist())}
    df_chunks.rename(columns=columns, inplace=True)
    df = pd.concat([df_header, df_chunks])
    print('*** Reading is Completed in chunks...')

ตัวอย่างรันกับไฟล์ 9,994 แถว chunk 1,000 แถว


file_name = 'Sample-sales-data-excel.xls'
stats = pd.read_excel(file_name)
print(f"Total rows: {len(stats.index)}")
global_excel_to_db_chunks(file_name, 1000)

ผลลัพธ์


Total rows: 9994
** Reading chunk number 0 with 1000 Rows
** Reading chunk number 1 with 1000 Rows
...
** Reading chunk number 9 with 994 Rows
*** Reading is Completed in chunks...

สรุป

  • Pandas read_excel ไม่มีพารามิเตอร์ chunksize เหมือน read_csv
  • ใช้ skiprows + nrows ใน while loop อ่านทีละ chunk
  • อ่าน header แยกก่อน แล้ว rename columns ของ chunks ให้ตรง
  • เหมาะสำหรับไฟล์ Excel ใหญ่ที่โหลดทั้งไฟล์หน่วยความจำไม่พอ