2017-07-11 18 views
0

には、Excelファイルがいっぱいのフォルダがあります。 1つの厄介な側面は、すべてが.xls(ではなく.xlsxではない)です。Python Merge .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を再作成し、古いものを上書きしてしまい、それを連結する代わりに。

EDIT

マージが今取り組んでいます。私の難しさは、セルからデータを取得し、最初の7行を削除してから新しい列を作成し、その列のすべての行にそのデータを追加する必要があるということです。

read_excel()が機能しないので、これを難しくしているのはread_html()だと思います。私は次のエラーを取得する:

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() 
関連する問題