2017-07-11 76 views
1

我在我的程序中有這樣的東西: 一個名爲'OpenFileinaModule'的文件夾中的主腳本main.py。有一個名爲'sub'的文件夾,裏面有一個名爲subScript.py的腳本和一個由subScript.py打開的文件xlFile.xlsx。Python - 如何打開模塊內的文件?

OpenFileinaModule/ 
      main.py 
      sub/ 
      __init__.py (empty) 
      subScript.py 
      xlFile.xlsx 

下面是代碼:

sub.Script.py:

import os, openpyxl 

class Oop: 
    def __init__(self): 
     __file__='xlFile.xlsx' 
     __location__ = os.path.realpath(
      os.path.join(os.getcwd(), os.path.dirname(__file__))) 
     print os.path.join(__location__, __file__) 

     self.wrkb = openpyxl.load_workbook(os.path.join(__location__, 
__file__),read_only=True) 

main.py:

import sub.subScript 
objt=sub.subScript.Oop() 

當我執行main.py,我得到的錯誤:

IOError: [Errno 2] No such file or directory: 'C:\\Users\\...\\OpenFileInaModule\\xlFile.xlsx' 

它跳躍的子文件夾... 我已經試過

__file__='sub/xlFile.xlsx' 

但隨後的 「子」 文件夾複製:

IOError: [Errno 2] No such file or directory: 'C:\\Users\\...\\OpenFileInaModule\\sub\\sub/xlFile.xlsx' 

如何使用subScript.py打開xlFile.xlsx從main.py?

回答

0

你壓倒一切__file____file='xlFile.xlsx',你的意思是做到這一點?


我想你想要像

import os 
fname = 'xlFile.xlsx' 
this_file = os.path.abspath(__file__) 
this_dir = os.path.dirname(this_file) 
wanted_file = os.path.join(this_dir, fname) 

我建議你總是使用絕對路徑的文件,特別是如果你使用的是Windows時,如果在一個相對路徑可能沒有什麼意義文件在不同的驅動器上(我實際上不知道如果你問它設備之間的相對路徑會做什麼)。

+1

這正是我所期待的。 這是常見的事情嗎? –

1

請避免使用__file____location__來命名變量,這些更像是可能導致混淆的內建變量。

注意的東西在這裏:

__location__ = os.path.realpath(
      os.path.join(os.getcwd(), os.path.dirname(__file__))) 

您還沒有sub目錄,上面的連接只在CWD + os.path.dirname(__file__)。這不會讓你到文件。請閱讀os.path.dirname的文檔:os.path.dirname(__file__)這裏返回一個空字符串。

def __init__(self): 
    file = 'xlFile.xlsx' 
    location = os.path.join('sub', file) 
    location = os.path.abspath(location)    # absolute path to file 
    location = os.path.realpath(location)   # rm symbolic links in path 
    self.wrkb = openpyxl.load_workbook(location)