2017-07-10 6 views
0

J'ai un programme qui tente de lire un fichier, s'il peut lire le fichier, il va générer une liste à partir de ce fichier et retourner une sélection aléatoire de cette liste à l'utilisateur. Si le fichier ne peut pas être trouvé, ou s'il y a une autre erreur, un message alertera l'utilisateur et le programme utilisera par défaut une liste par défaut dans le code source de mon programme.FileNotFoundError, os.getcwd() retourne le nom du fichier et non un répertoire

Je passe la première partie du nom de fichier d'une fonction à une fonction readFile() qui ajoute '.txt' au nom de fichier qui lui a été transmis et essaie de lire l'un des trois fichiers, selon le nom de la fonction a été donné.

Malgré les fichiers existants, et je l'ai affiché des extensions cachées pour vous assurer qu'il ne .txt.txt appelé, le programme est encore un FileNotFoundError retournaient

Recherche en ligne, je l'ai entendu mention os.getcwd() J'ai donc couru print (os.getcwd()) au début de ma fonction readFile() et ce qui était retourné était all.txt; "all" étant la valeur que j'ai passé à readFile() pour effectuer ce test. Donc je crois que le fichier, dans ce cas, all.txt est introuvable, car le répertoire de travail du programme dans cette fonction est défini sur le nom de fichier plutôt que sur le répertoire du programme.

Comment puis-je résoudre ce problème? Voici la fonction qui passe le nom du fichier, sans inclure l'extension à la fonction readFile(); il y a plusieurs options, j'ai juste inclus le premier pour améliorer la lisibilité ici, toutes les options retournent la même erreur, et se comportent de la même manière.

def generateActivity() : 

chores = ['Washing Up', 'Laundry'] 
fun = ['Watch TV', 'Play a game'] 

allActivities = chores + fun 
print(allActivities) 

if menu() == 'R' : 

    try : 
     allList = readFile('all') 
     displayOutput(random.choice(allList)) 

    except FileNotFoundError : 
     print('Sorry, all activities list, file not found') 
     print('Using default all activities list...\n') 
     displayOutput(random.choice(allActivities)) 

    except : 
     print('Sorry there was an error with all.txt') 
     print('Using default all activities list...\n') 
     displayOutput(random.choice(allActivities)) 

Ceci est la fonction readFile().

def readFile(list) : 

print(os.getcwd()) 

READ = 'r' 
fileName = list + '.txt' 

with open(fileName, READ) as f : 
    # Reads the entire file 
    dictionary = f.readlines() 

# Seperates each word to create a list of words 
Activitylist = [word.strip() for word in dictionary] 

return(ActivityList) 

Répondre

0

J'utiliser input() au lieu de def readFile(list).

Voici un code facultatif pour vous d'utiliser si je vous ai bien compris:

#!/usr/bin/env python 

''' 
1. Read a file. 
1a. If file can be read, generate a list from that file. 
1b. Return a random selection from that list to the user. 
''' 

''' 
2. If file cannot be read or error: alert user with message 
2a. Use default list. 
''' 

import os 
import pathlib 
import random 

#Print the current working directory to check if path is correct. 

cwd = os.getcwd() 
print("This is the directory the desired file is located: " + cwd) 

#Request input from user for name of file. 

file_desired = input() + '.txt' 

#Use pathlib to set path of the file. 

path = pathlib.Path('write_full_path_to_directory_here' + file_desired) 
print(path) 

#If the path of the file exists, use list from file. 

if path.is_file(): 
    with open (file_desired, 'r') as file_wanted: 
     print("File is available.") 
     dictionary = file_wanted.readlines() 
     Activitylist = [word.strip() for word in dictionary] 
     print(random.choice(Activitylist)) 

#If file path does not exist, then use default list. 

else: 
    print('Sorry, all activities list, file not found') 
    print('Using default all activities list...\n') 

    chores = ['Washing Up', 'Laundry'] 
    fun = ['Watch TV', 'Play a game'] 

    allActivities = chores + fun 

    print(random.choice(allActivities)) 

Hope that helps!

Omneya

+0

Nous vous remercions de votre contribution @Omneya – sugarfree