Python處理Excel生成CSV文檔


Python是一種解釋型的、動態數據類型的、面向對象的高級程序設計語言。擁有豐富的處理數據和文本類庫,並且得益於它是一種解釋型的語言,在程序修改和功能擴展上,可以很容易做到大規模的調整。綜合考慮Python的動態、輕量化特性,使用Python來處理Excel自動生成CSV文檔的操作。 程序的運行需要依賴兩個Python的類庫,Pandas和Xlrd。Pandas是Python的一個數據分析類庫。Xlrd則是幫助開發人員從Microsoft的Excel操作數據的好幫手。

 

至於為什么要把Excel變成CSV就很簡單了。由於CSV基於“,”符號切割字符串表單,因此,在程序上,讀寫訪問非常方便。不需要導入厚重的Excel類庫,只需要基於string數據結構就可以實現基本的表單管理。

一.Python和相關依賴庫的配置步驟

1. 安裝Python

請到Python官網下載並安裝Python運行時:https://www.python.org/downloads/

2. 安裝成功后,請打開Cmd控制台,輸入如下命令安裝Pandas

pip install pandas

 

 

3. 接着輸入如下命令安裝Xlrd

pip install xlrd

 

 

4. 如果你使用PyCharm,那么該工程的引用庫安裝導入方式如下:

    File -> Settings -> Project: [current project name] -> ProjectInterpreter -> +(Add Button) -> 彈出的搜索框里分別依次選中PandasXlrd

 

 

二.轉換實現

在開始編碼前,我們思考一下轉換的流程:

 

  先收集所有的Excel文件 -> 遍歷每一個Excel文件 -> Excel文件中還有眾多的Sheet組成,也要遍歷他們 -> 最終把Sheet為單位生成獨立的CSV文件

 

那么接下來就是要研究那些API可以幫忙我們,如何獲取目錄文件集,如何打開excel文檔,如何遍歷sheet,如何保存成csv文檔等等。這里就不流水賬羅列過程了,直接貼出成品代碼,下面的代碼是上述思考過程的最終成品。最后,我們啟動PyCharm運行腳本,顯然當前腳本很好的搜索的指定的目錄,並把所有表格的Sheet生成對應的CSV文檔。 

 

對了,代碼里面我還留一個彩蛋,如何遍歷所有的表格單元。這個,可以很好的幫你處理非法的單元格數據,關鍵的代碼就是調用dataframe的applymap方法。代碼中示例輸入的方法是foreach_cell,該方法的本體是將nan的數據變成0。

另外,你還會發現,我用了xlrd獲取sheet列表,但是我又另外使用pandas打開對應sheet。我之所以這樣做,只是覺得pandas生成csv方便。所以,繞了點彎路。但是無大礙,一個轉換代碼而已,起碼能利用各個優點(不是借口的借口吧)。Pandas有一個悲劇的地方就是不能獲取Excel的Sheet總體情況,不傳入指定的Sheet,默認打開的是第一個Sheet。

 

import os
import math
import xlrd
import pandas as pd


def get_all_table_file_name(folder_path):
    table_names = []
    for file in os.listdir(folder_path):
        if os.path.splitext(file)[1] == '.xls' or os.path.splitext(file)[1] == '.xlsx':
            table_names.append(file)
    return table_names


def foreach_cell(cell):
        if type(cell) is float and math.isnan(cell):
            cell = 0
        return cell


def convert_table_to_csv(folder_path, file_name):
    file_path = folder_path + '/' + file_name
    print('開始轉換Excel文檔: ' + file_path + ' 成 CSV 文檔')

    tables = xlrd.open_workbook(file_path)
    print('..Sheet總數: ' + tables.nsheets.__str__())

    for sheet_table in tables.sheets():
        csv_file_name = file_name.replace('.xlsx', '')
        csv_file_name = csv_file_name.replace('.xls', '')
        output_path = 'output/' + csv_file_name + sheet_table.name + ".csv"

        sheet = pd.read_excel(file_path, sheet_table.name, index_col=None, index=False)
        sheet.columns = sheet.columns.str.replace('Unnamed.*', '')
        sheet.applymap(foreach_cell)
        sheet.to_csv(output_path, encoding='utf-8', index=False)
        print('....已經生成 ' + csv_file_name + sheet_table.name + ' CSV文檔')


def convert_all_tables_to_csv(folder_paths):
    for folder_path in folder_paths:
        table_files = get_all_table_file_name(folder_path)
        for table_file in table_files:
            convert_table_to_csv(folder_path, table_file)


scan_folders = ['.', 'tables']
convert_all_tables_to_csv(scan_folders)

 

 

 

 

 

 

作者:雨天

地址:http://www.cnblogs.com/HelloGalaxy/p/8863436.html  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM