2017-07-11 103 views
0

已經有一個文件夾完整的Excel文件。一個惱人的方面是它們都是.xls(而不是.xlsx)。Python合併.xls文件

我需要做的是在每個.xls文件中讀取,刪除前7行,然後取出剩餘的文檔並將其添加到「master.xlsx」文件中。 (注意:master.xlsx不一定是預先存在的,可以新創建)

我還沒有開始嘗試刪除行,只是試圖簡單地合併它們,但無法弄清楚如何。我是否需要以某種方式將所有.xls轉換爲.xlsx,然後嘗試合併?我花了幾個小時看着其他堆棧溢出問題和在線資源。這似乎是某種古老的技術。另外,值得一提的是我正在使用Python3。

這裏是我到目前爲止的代碼:

import os 
from numpy import genfromtxt 
import re 
import urllib.request 
import pandas as pd 


# script directory 
script_dir = os.path.dirname(r'C:/Users/Kenny/Desktop/pythonReports/') 


# get array list of files 
files = [] 
file_abs_path = script_dir + '/excels/' 
for file in os.listdir(file_abs_path): 
    if file.endswith('.xls'): 
     excel_file_path = script_dir + '/excels/' + file 
     files.append(excel_file_path) 

# f is full file path 
df_array = [] 
writer = pd.ExcelWriter('master.xlsx') 
for f in files: 
    sheet = pd.read_html(f) 

    for n, df in enumerate(sheet): 
     df_array.append(df) 
     # df = df.append(df) 
    # df.to_excel(writer,'sheet%s' % n) 
print(df_array) 

for df in df_array: 
     # new_df = new_df.append(df) 
     new_df = pd.concat(df_array) 
     new_df.to_excel(writer,'sheet%s' % n) 
     writer.save() 
    # print(sheet) 

在某些時候,我沒有得到的錯誤,這是閱讀和正確複製的內容,但它會重新寫入master.xlsx並覆蓋舊的東西,而不是連接它。現在

編輯

合併工作。我現在的困難是我需要從單元中獲取數據,刪除前7行,然後創建一個新列並將該數據添加到該列中的所有行(針對文檔的長度)。

我認爲有一件事情使得這個難題是我必須使用read_html(),因爲read_excel()不起作用。我得到以下錯誤:

Traceback (most recent call last): 
    File "script.py", line 83, in <module> 
    sheet = pd.read_excel(f) 
    File "C:\Users\Kenny\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\excel.py", line 200, in read_excel 
    io = ExcelFile(io, engine=engine) 
    File "C:\Users\Kenny\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\excel.py", line 257, in __init__ 
    self.book = xlrd.open_workbook(io) 
    File "C:\Users\Kenny\AppData\Local\Programs\Python\Python36-32\lib\site-packages\xlrd\__init__.py", line 441, in open_workbook 
    ragged_rows=ragged_rows, 
    File "C:\Users\Kenny\AppData\Local\Programs\Python\Python36-32\lib\site-packages\xlrd\book.py", line 91, in open_workbook_xls 
    biff_version = bk.getbof(XL_WORKBOOK_GLOBALS) 
    File "C:\Users\Kenny\AppData\Local\Programs\Python\Python36-32\lib\site-packages\xlrd\book.py", line 1230, in getbof 
    bof_error('Expected BOF record; found %r' % self.mem[savpos:savpos+8]) 
    File "C:\Users\Kenny\AppData\Local\Programs\Python\Python36-32\lib\site-packages\xlrd\book.py", line 1224, in bof_error 
    raise XLRDError('Unsupported format, or corrupt file: ' + msg) 
xlrd.biffh.XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'\n<html>\n' 
+1

'new_df = pd.concat(df_array)' iirc ...你只是簡單地將'new_df'分配給'df' ... –

+0

同意Corley,'pd.concat(df)'並沒有合併任何東西,而是隻給你你握手的框架它。但是'pd.read_excel'也不處理xls文件? –

+0

謝謝,這是有道理的,並有很大的幫助!我想我正走在正確的軌道上。現在我可以在文件的結尾添加新的數據。現在我想我需要在添加到數組之前發現刪除前7行。將更新最新代碼的問題。 – Kenny

回答

0

這裏是我的合併(有一個可愛的小動態變化的print語句太)最終解決方案:

# Merge all .xlsx files into one 'master.xlsx' 

files = get_files('/xlsx/', '.xlsx') 
df_array = [] 
all_data = pd.DataFrame() 
writer = pd.ExcelWriter('master.xlsx') 

for i, f in enumerate(files, start=1): 
    sheet = pd.read_excel(f) 
    all_data = all_data.append(sheet, ignore_index=True) 

    # progress of entire list 
    if i <= len(files): 
     print('\r{:*^7}{:.0f}%'.format('Merging: ', i/len(files)*100), end='') 

all_data.to_excel(writer, 'sheet') 
writer.save() 
你可能想