2017-05-05 1 views
0

openpyxl、os、tkinterを使って人がファイルディレクトリを選択し、そのディレクトリのExcelファイルから特定のセルからデータを抽出できるプログラムがあります。現状では、Pythonファイルが、データが抽出されているファイルと同じフォルダにある場合にのみ実行されます。python 2.7 - Excelブックからデータを抽出するプログラム - ファイルと同じフォルダに保存する必要があるのはなぜですか?

プログラムファイルをそのフォルダの外に保存できるようにしたいのですが、なぜ私のコードに基づいてそのフォルダ内にある必要があるのか​​わかりません。誰かがこれを必要としているコード内の場所に向けることができますか?

あなたは

#!/usr/bin/env python 


import os 
import openpyxl 
import Tkinter as tk 
from Tkinter import * 
import tkFileDialog, tkMessageBox, ttk 



def file_open(): 
    file_path = tkFileDialog.askdirectory() 
    if file_path == "": 
     tkMessageBox.showinfo("Error", "No Folder Selected") 
    else: 
     ALL_SHEETS = [f for f in os.listdir(file_path) 
       if os.path.isfile(os.path.join(file_path, f)) 
       and f.endswith('.xlsx')] 
     HEAD = 1 
     ROW = 2 
     START = 1 
     END = 11 

     OUTFILE = 'empty_book.xlsx' 

     def get_row(sht, start, end, row): 
      row_data = [] 
      for col in range(start, end): 
       d = sht.cell(row=row, column=col) 
       row_data.append(d.value) 
      return row_data 


     def get_all(files): 
      data_rows = [] 
      for f in files: 
       wb = openpyxl.load_workbook(filename=f, data_only=True) 
       sheet = wb.get_sheet_by_name('Data') 
       row = get_row(sheet, START, END, ROW) 
       data_rows.append(row) 
      return data_rows 


     def get_headings(sheets): 
      first = sheets[1] 
      wb = openpyxl.load_workbook(filename=first) 
      sheet = wb.get_sheet_by_name('Data') 
      row = get_row(sheet, START, END, HEAD) 
      return row 


     def write_new(header, data, f): 
      wb = openpyxl.Workbook() 
      ws1 = wb.active 
      ws1.title = 'Data' 
      ws1.append(header) 
      for row in data: 
       ws1.append(row) 
      wb.save(filename=f) 

     def together(): 
      sheets = sorted(ALL_SHEETS) 
      header = get_headings(sheets) 
      data = get_all(sheets) 
      write_new(header, data, OUTFILE) 

     together() 

     tkMessageBox.showinfo("Great Job!", "Data Extraction Successful!") 


class NSC(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.parent = parent 
     self.parent.title("Degree Planner Data Extractor") 
     l1 = tk.Label(text="Degree Planner Data Extractor", font=('Segui',   
      20)) 
     l1.place(x = 35, y = 20) 
     nscButton = tk.Button(text=' Extract data from degree planners ',   
        command=file_open) 
     nscButton.place(x= 80, y=100) 
     quitButton = tk.Button(text=" Quit ", command=self.quit) 
     quitButton.place(x=155, y=155) 

def main(): 

    root = Tk() 
    w = 400 
    h = 250 
    ws = root.winfo_screenwidth() # width of the screen 
    hs = root.winfo_screenheight() # height of the screen 
    x = (ws/2) - (w/2) 
    y = (hs/2) - (h/2) 
    root.geometry('%dx%d+%d+%d' % (w, h, x, y)) 
    root.resizable(0,0) 
    app = NSC(root) 
    root.mainloop() 

if __name__ == '__main__': 

    main() 
+0

これは大量のコードです。あなたは例としてかなり縮小することができます。 – tdelaney

+0

はい、あなたは正しいですし、それについては申し訳ありません。私はちょうどコードのどこに問題が起きたのかわからなかったので、私はすべての場合に備えてほしいと思った。 – jerinbrown

答えて

1

あなたはちょっと、すでにあなたのコードで問題を解決しましたありがとうございました。 os.listdirはパスなしでファイル名を返します。isfileテストではos.path.joinが必要でした。その結合された名前をリストに追加する必要があります。

ALL_SHEETS = [os.path.join(file_path, f) for f in os.listdir(file_path) 
      if os.path.isfile(os.path.join(file_path, f)) 
      and f.endswith('.xlsx')] 

glob.glob誰かが「.xlsxの」ディレクトリの名前という小さなリスクとほぼ同じことを行います。

from glob import glob 
    ALL_SHEETS = [f for f in glob(os.path.join(file_path, "*.xlsx")) 
      if os.path.isfile(f)]] 
+0

ありがとう、tdelaney!残念ながら、私は両方のオプションで試してみましたが、ファイルがフォルダの外に保存されているとどちらもうまくいきません。ただし、ファイル*が同じフォルダに保存されている場合は両方とも機能します。問題はおそらくコード内の別の場所ですか? – jerinbrown

+0

"うまくいかない"と言うと、どういうことが間違っていますか? – tdelaney

+0

私の悪い...私が追加した 'os.path.join'に' file_path'を追加するのを忘れました。私はソースを修正しました。 – tdelaney

関連する問題