2017-07-11 1 views
1

J'ai quelque chose comme ça dans mon programme: Un script principal main.py dans un dossier nommé 'OpenFileinaModule'. Il y a un dossier appelé 'sub' à l'intérieur avec un script appelé subScript.py et un fichier xlFile.xlsx, qui est ouvert par subScript.py.Python - Comment ouvrir un fichier dans un module?

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

Voici le code:

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() 

Quand j'exécute main.py, je reçois la erreur:

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

Il saute le sous-dossier ... J'ai essayé

__file__='sub/xlFile.xlsx' 

Mais le "sous" le dossier est dupliquée:

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

Comment ouvrir xlFile.xlsx avec subScript.py de main.py?

Répondre

0

vous surchargez __file__ avec __file='xlFile.xlsx', voulez-vous dire cela?


Je pense que vous voulez quelque chose comme

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) 

Je suggère d'utiliser toujours le chemin absolu d'un fichier, surtout si vous êtes sur les fenêtres quand un chemin relatif peut-être pas de sens si le le fichier est sur un lecteur différent (je n'ai en fait aucune idée de ce qu'il ferait si vous lui demandiez un chemin relatif entre les périphériques).

+1

C'est exactement ce que je cherchais. Est-ce une chose commune à faire? –

1

Veuillez éviter d'utiliser __file__ et __location__ pour nommer vos variables, elles ressemblent plus à des variables internes qui pourraient causer une confusion.

Notez quelque chose:

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

Vous n'avez pas inclus sub répertoire et les jointures ci-dessus que l'encéphalopathie des cervidés + os.path.dirname(__file__). Cela ne vous permet pas d'accéder au fichier. Veuillez lire la documentation de os.path.dirname: os.path.dirname(__file__) renvoie une chaîne vide ici.

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)