2017-05-05 1 views
0

필자는 openpyxl, os 및 tkinter를 사용하는 프로그램을 사용하여 파일 디렉토리를 선택한 다음 해당 디렉토리의 Excel 파일에서 특정 셀의 데이터를 추출 할 수 있습니다. 있는 그대로, 파이썬 파일이 데이터가 추출되는 파일과 같은 폴더에있는 경우에만 실행됩니다.python 2.7 - 엑셀 워크 북에서 데이터를 추출하는 프로그램 - 왜 파일과 같은 폴더에 저장해야합니까?

프로그램 파일을 해당 폴더 외부에 저장할 수 있도록 만들고 싶지만 내 코드를 기반으로 해당 폴더 내에 있어야하는 이유를 알 수 없습니다. 누군가가 코드에서 이것이 필요하게 만드는 장소를 가리킬 수 있습니까?

#!/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

감사합니다, 감사합니다! 불행히도, 나는 두 옵션을 모두 사용하여 시도하고 파일이 폴더 외부에 저장되어 있으면 둘 다 작동하지 않습니다. 그러나 파일 *이 같은 폴더에 저장되어 있으면 둘 다 작동합니다. 문제가 코드의 어딘가에 있습니까? – jerinbrown

+0

"작동하지 않는다"고 할 때, 정확히 무엇이 잘못 될까요? – tdelaney

+0

내 나쁜 ... 내가 추가 한'os.path.join'에'file_path'를 추가하는 것을 잊어 버렸습니다. 나는 근원을 고쳤다. – tdelaney

관련 문제