web-dev-qa-db-fra.com

Python - écriture et lecture à partir d'un fichier temporaire

J'essaie de créer un fichier temporaire que j'écris sur certaines lignes à partir d'un autre fichier, puis de créer des objets à partir des données. Je ne sais pas comment trouver et ouvrir le fichier temporaire pour pouvoir le lire. Mon code:

with tempfile.TemporaryFile() as tmp:
    lines = open(file1).readlines()
    tmp.writelines(lines[2:-1])

dependencyList = []

for line in tmp:
    groupId = textwrap.dedent(line.split(':')[0])
    artifactId = line.split(':')[1]
    version = line.split(':')[3]
    scope = str.strip(line.split(':')[4])
    dependencyObject = depenObj(groupId, artifactId, version, scope)
    dependencyList.append(dependencyObject)
tmp.close()

Essentiellement, je veux juste créer un document temporaire d'intermédiaire pour me protéger contre l'écrasement accidentel d'un fichier.

17
d.griner

Selon le docs , le fichier est supprimé lorsque le TemporaryFile est fermé et cela se produit lorsque vous quittez la clause with. Donc ... ne quittez pas la clause with. Rembobinez le fichier et faites votre travail dans le with.

with tempfile.TemporaryFile() as tmp:
    lines = open(file1).readlines()
    tmp.writelines(lines[2:-1])
    tmp.seek(0)

    for line in tmp:
        groupId = textwrap.dedent(line.split(':')[0])
        artifactId = line.split(':')[1]
        version = line.split(':')[3]
        scope = str.strip(line.split(':')[4])
        dependencyObject = depenObj(groupId, artifactId, version, scope)
        dependencyList.append(dependencyObject)
20
tdelaney

Vous avez un problème de portée; le fichier tmp n'existe que dans le cadre de l'instruction with qui le crée. De plus, vous devrez utiliser un NamedTemporaryFile si vous souhaitez accéder au fichier plus tard en dehors du with initial (cela donne au système d'exploitation la possibilité d'accéder au fichier). De plus, je ne sais pas pourquoi vous essayez d'ajouter à un fichier temporaire ... car il n'aura pas existé avant de l'instancier.

Essaye ça:

import tempfile

tmp = tempfile.NamedTemporaryFile()

# Open the file for writing.
with open(tmp.name, 'w') as f:
    f.write(stuff) # where `stuff` is, y'know... stuff to write (a string)

...

# Open the file for reading.
with open(tmp.name) as f:
    for line in f:
        ... # more things here
17
Pierce Darragh

Dans le cas où le fichier doit être ouvert une deuxième fois, par ex. lu par un processus différent ceci pourrait causer des problèmes sur le système d'exploitation Windows :

Si le nom peut être utilisé pour ouvrir le fichier une deuxième fois, alors que le fichier temporaire nommé est toujours ouvert, cela varie selon les plateformes (il peut être utilisé sur Unix; il ne peut pas sur Windows NT ou version ultérieure).

Par conséquent, une solution sûre consiste à créer un répertoire temporaire à la place, puis à y créer manuellement un fichier:

import os.path
import tempfile

with tempfile.TemporaryDirectory() as td:
    f_name = os.path.join(td, 'test')
    with open(f_name, 'w') as fh:
        fh.write('<content>')
    # Now the file is written and closed and can be used for reading.
0
a_guest