2013-09-27 6 views
0

Je suis en train d'automatiser une tâche fastidieuse à mettre à jour les statuts de nos/bugs pour modifier les demandes de cr /. Étant donné que le schéma de base est extrêmement complexe, j'ai eu recours à une commande émis boucle sur le serveur Web pour télécharger une décharge des CRs ainsi que leurs statuts associés. Je faisais avec avec un appel os.system() mais j'ai décidé de le rendre plus pythonique et utiliser pycurl. Le problème, je pense, est que lorsque j'écris le fichier n'est pas encore terminée csv sur le disque téléchargé, quand je vais y accéder (juste après la c.perform()). Je suis amené à croire cela parce que l'erreur montre un list index out of range. Mais quand j'ouvre le fichier moi-même, il semble que toutes les données sont là. Voici l'extrait de code (dans la méthode find_bugs je délivre une scission sur chaque ligne et l'index dans la colonne correspondante de chaque ligne - qui est où l'indice de liste vient):en utilisant pycurl pour obtenir une « décharge csv »

f = open(cr_file, 'w+') 

c = pycurl.Curl() 
c.setopt(c.URL, csv_url) 
c.setopt(c.WRITEFUNCTION, f.write) 
c.setopt(c.HTTPHEADER, headers) 
c.perform() 


with open(cr_file, 'r') as f: 
    ids = find_bugs(f.readlines()) 

Question: Comment puis-je écrire sur le disque en utilisant pycurl quand j'ai besoin d'accéder immédiatement au fichier une fois terminé?

Répondre

1

Jusqu'à ce que le premier objet de fichier est vidé/fermé, le contenu du fichier ne peut pas être dans le fichier.

>>> f = open('text.csv', 'w+') 
>>> f.write('asdf') 
>>> 
>>> f2 = open('text.csv', 'r') 
>>> f2.read() 
'' 
>>> f2.close() 

Après close:

>>> f.close() 
>>> f2 = open('text.csv', 'r') 
>>> f2.read() 
'asdf' 

Parce que vous ouvrez le fichier avec le mode w+, vous pouvez utiliser cet objet de fichier pour lire le contenu:

with open(cr_file, 'w+') as f: 
    c = pycurl.Curl() 
    c.setopt(c.URL, csv_url) 
    c.setopt(c.WRITEFUNCTION, f.write) 
    c.setopt(c.HTTPHEADER, headers) 
    c.perform() 

    f.seek(0) 
    ids = find_bugs(f.readlines()) 
+0

agréable. Merci. +1 pour tirer parti de/ne pas créer une autre poignée de fichier. – Ramy

Questions connexes