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) -> 彈出的搜索框里分別依次選中Pandas和Xlrd。
二.轉換實現
在開始編碼前,我們思考一下轉換的流程:
先收集所有的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)
作者:雨天