2017-10-13 14 views
0

Pendant que j'essayais d'imprimer le contenu du fichier ligne par ligne en python, je ne peux pas rembobiner le fichier ouvert par f.seek (0) pour imprimer le contenu si le fichier a été ouvert par avec open (« nom_fichier ») comme f: mais, je peux le faire si j'utilise open (« nom_fichier ») comme f: puis f .Seek (0)Comment le fichier ouvert ne peut pas être rembobiné par seek (0) après avoir utilisé avec open() en python

Après mon code

with open("130.txt", "r") as f:    #f is a FILE object 
    print (f.read())      #so f has method: read(), and f.read() will contain the newline each time 

f.seek(0)        #This will Error! 
with open("130.txt", "r") as f:  #Have to open it again, and I'm aware the indentation should change 
for line in f:      
    print (line, end="")   

f = open("130.txt", "r") 
f.seek(0) 
for line in f: 
    print(line, end="") 

f.seek(0)       #This time OK! 
for line in f: 
    print(line, end="") 

Je suis un débutant python, quelqu'un peut-il me dire pourquoi?

Répondre

2

Le premier f.seek(0) jetteront une erreur, car

with open("130.txt", "r") as f: 
    print (f.read()) 

fermera le dossier à la fin du bloc (une fois le fichier sera imprimé)

Vous aurez besoin de faire quelque chose comme :

with open("130.txt", "r") as f: 
    print (f.read()) 

    # in with block 
    f.seek(0) 
0

le but de with est de nettoyer la ressource lorsque les extrémités du bloc, qui dans ce cas incluraient la fermeture de la poignée de fichier.

Vous devriez pouvoir .seek dans le séquencée with ce, bien que:

with open('130.txt','r') as f: 
    print (f.read()) 

    f.seek(0) 
    for line in f: 
    print (line,end='') 

De votre commentaire, with dans ce cas est le sucre syntaxique pour quelque chose comme ceci:

f = open(...) 
try: 
    # use f 
finally: 
    f.close() 

# f is still in scope, but the file handle it references has been closed 
+0

Merci! Est-ce que le premier objet FILE ** f ** disparaît ou non? Avec * type (f) * j'ai: * * qui semble toujours exister. Difficile de passer à Python. – Yifangt

+0

'f' existe toujours et référencera l'encapsuleur autour du handle de fichier, mais le handle qu'il encapsulera aura été fermé, donc lors d'appels ultérieurs, ils échoueront. Je souhaite que 'f' soit étendu au bloc' with', mais Python est plutôt lâche avec ce genre de chose. – ryachza

+0

Je vois, le gestionnaire est toujours là, mais le contenu qu'il a enveloppé a été fermé. Problème effacé! Merci beaucoup! – Yifangt