2014-04-27 1 views
2

Je suis un débutant essayant d'ouvrir un fichier dans le cadre d'une fonction où le nom/chemin du fichier est la variable de la fonction. J'en ai écrit un mais je reçois une erreur sur une fonction similaire. Voici le code de fonction:ouvrir un fichier dans une fonction python 3

def read_board(board_file): 
    """ (file path) -> list of str 

    Return a board read from open file board_file. 

    >>>read_board('C:\Python33\Doc\theboard1.txt') 
    """ 

    bo_file = open(board_file, 'r') 
    lines = bo_file.readlines() 

    return lines 

Je reçois cette erreur

OSError: [Errno 22] Invalid argument: 'C:\Python33\Doc\theboard1.txt'

Le chemin est correct (triple vérifié) et j'utilise cet exemple pour tester le fichier lu.

+0

Veuillez poster un code python correct (syntaxiquement). comme actuellement formaté, il n'est pas valide. – aruisdante

+0

nettoyé le code et l'imbrication, si c'était votre sens –

Répondre

2

Vous devez utiliser le double backslash échapper à la barre oblique inverse, ce qui suit fonctionnera:

read_board('C:\\Python33\\Doc\\theboard1.txt') 

Il en est ainsi que python traite la deuxième \ comme littérale et ne pas l'utiliser comme échapper caractère pour le caractère après comme dans votre cas.

+1

Et c'est pourquoi vous devriez toujours utiliser '' os.path.join'' pour construire des chemins ... – aruisdante

+0

merci, ça fonctionne maintenant. Je ne sais pas comment l'autre a appelé quoi que ce soit, mais je suis sur la bonne voie. –

+0

@sharkysmachine: Pour être plus explicite, le '\ t 'de votre chemin a été converti en caractère tabulateur. Essayez d'imprimer votre chaîne d'origine où les barres obliques inverses n'ont pas été doublées (et lorsque la chaîne littérale n'est pas marquée comme 'r'raw chaîne littérale '). – pepr

0

Et vous pouvez :: L'utilisation

os.sep

entre les fichiers comme

("C:"+os.sep+"user")

Après l'importation module os

2

Je vous suggère normalement en utilisant os.path.join mais comme chemins d'accès Windows sont si cerveau endommagées De toute façon, cela ne va pas aider beaucoup.¹

O manière ne l'obtenir est le droit d'utiliser la chaîne de Python brut qui ne l'interprète pas antislashs:

open(r'c:\stupid\junk.txt') 

ou tout simplement prétendent que DOS était un mauvais rêve et utiliser des barres obliques comme Dieu a prévu:

open('c:/stupid/junk.txt') 

¹exercise pour le lecteur: que retourne os.path.join('c:', 'junk.dat')? Est-ce un comportement différent de celui de `os.path.join ('stupid', 'junk.txt')? Est-ce que cela a été un confusion for a while?

Questions connexes