2014-05-03 4 views
-3

Ceci est probablement un étirement. J'ai un def (ou une fonction) qui prend un nom de fichier, ouvre le fichier et effectue une action sur le contenu du fichier. Y a-t-il un moyen en Python d'utiliser une variable à la place du nom de fichier? En d'autres termes, donnez une chaîne ou des attributs de fichier de liste.Utiliser une variable comme fichier

def Albert(fname): 
    f = open(fname, 'r') 
    for i in f.readline(): 
     print(i) 
#Main 
Collins = 'Blues Guitar\n' 
Albert(Collins) 
+1

Pourquoi serait-ce un étirement? C'est exactement comme ça que ça fonctionne. Votre seul problème est que votre chaîne 'Collins' a une nouvelle ligne, qui n'est pas valide dans un nom de fichier. –

+0

Mais 'Collins' n'est pas un nom de fichier, c'est une chaîne qui contient 'Blues Guitar \ n'. Je voudrais que le contenu de la variable 'Collins' soit traité comme le contenu d'un fichier. J'ai du mal à exprimer ça. – brett

+1

Vous souhaitez qu'un objet de fichier en mémoire avec le * contenu * soit dicté par la variable. Vous n'avez en effet pas précisé cela. Dans ce cas, votre question est dupe de [Utilisation de Python, comment puis-je lire/écrire des données en mémoire comme je le ferais avec un fichier?] (Http://stackoverflow.com/q/1883326) –

Répondre

-1

Merci Martijn. Je vais devoir passer f = ouvert (FNAME, 'r') en dehors d'Albert (FNAME) -

def Albert(fname): 

    while True: 
     onechar = fname.read() 
     if not onechar: 
      break 
     else: 
      print(onechar, end = '') 
    print() 

#Main 
import io 

#stringIO mode 
Collins = io.StringIO('Blues Guitar') 
Albert(Collins) 

#fileIO mode 
fname = open('infile.txt', 'r') 
Albert(fname) #where infile.txt containes 'Blues Guitar' 

#Output 
Blues Guitar 
Blues Guitar 

Mais cela va un long chemin et empêche la réécriture de ma définition réelle!

+0

Supprimez le '.readlines()'. Il lit le fichier en mémoire en premier ce qui n'est pas nécessaire. (La différence ne serait visible qu'avec des fichiers volumineux.) Vous pouvez également tester le type et/ou les attributs du 'fname' passé et décider si vous voulez l'ouvrir dans la fonction, ou bien l'envelopper dans' io. StringIO'. – pepr

+0

Débarrassez-vous du \ n –

+0

Votre droit. J'ai changé fname.readlines() en fname.getvalue(). fname est de type string. – brett

Questions connexes