Recherche…


Introduction

Lorsqu'il s'agit de stocker, de lire ou de communiquer des données, le travail avec les fichiers d'un système d'exploitation est à la fois nécessaire et facile avec Python. Contrairement à d'autres langages où l'entrée et la sortie de fichiers requièrent des objets complexes de lecture et d'écriture, Python simplifie le processus en n'exigeant que des commandes pour ouvrir, lire / écrire et fermer le fichier. Cette rubrique explique comment Python peut interfacer avec les fichiers du système d'exploitation.

Syntaxe

  • file_object = open (filename [, access_mode] [, mise en mémoire tampon])

Paramètres

Paramètre Détails
nom de fichier le chemin d'accès à votre fichier ou, si le fichier se trouve dans le répertoire de travail, le nom de fichier de votre fichier
Mode d'accès une valeur de chaîne qui détermine comment le fichier est ouvert
mise en mémoire tampon une valeur entière utilisée pour la mise en mémoire tampon des lignes en option

Remarques

Éviter l'enfer d'encodage multiplateforme

Lorsque vous utilisez open() intégré à Python, il est recommandé de toujours passer l'argument d' encoding si vous souhaitez que votre code soit exécuté sur plusieurs plates-formes. La raison en est que l'encodage par défaut d'un système diffère d'une plateforme à l'autre.

Bien que les systèmes linux utilisent effectivement utf-8 par défaut, ce n'est pas forcément vrai pour MAC et Windows.

Pour vérifier le codage par défaut d'un système, essayez ceci:

import sys
sys.getdefaultencoding()

à partir de n'importe quel interpréteur Python.

Par conséquent, il est sage de toujours spécifier un encodage pour vous assurer que les chaînes avec lesquelles vous travaillez sont codées comme vous le pensez, garantissant ainsi la compatibilité entre les plates-formes.

with open('somefile.txt', 'r', encoding='UTF-8') as f:
    for line in f:
        print(line)

Modes de fichier

Vous pouvez ouvrir un fichier avec différents modes, spécifiés par le paramètre mode . Ceux-ci inclus:

  • 'r' - mode de lecture. Le défaut. Cela vous permet seulement de lire le fichier, pas de le modifier. Lorsque vous utilisez ce mode, le fichier doit exister.

  • 'w' - mode d'écriture. Il créera un nouveau fichier s'il n'existe pas, sinon le fichier sera effacé et vous pourrez y écrire.

  • 'a' - mode d'ajout. Il écrira des données à la fin du fichier. Il n'efface pas le fichier et le fichier doit exister pour ce mode.

  • 'rb' - mode de lecture en binaire. Ceci est similaire à r sauf que la lecture est forcée en mode binaire. C'est aussi un choix par défaut.

  • 'r+' - mode de lecture plus mode d'écriture en même temps. Cela vous permet de lire et d'écrire dans des fichiers en même temps sans avoir à utiliser r et w .

  • 'rb+' - mode lecture et écriture en binaire. La même chose que r+ sauf que les données sont en binaire

  • 'wb' - mode d’écriture en binaire. La même chose que w sauf que les données sont en binaire.

  • 'w+' - mode d'écriture et de lecture. Le même que r+ mais si le fichier n'existe pas, un nouveau est créé. Sinon, le fichier est écrasé.

  • 'wb+' - mode d’écriture et de lecture en mode binaire. La même chose que w+ mais les données sont en binaire.

  • 'ab' - ajout en mode binaire. Similaire à a sauf que les données sont en binaire.

  • 'a+' - mode d’ajout et de lecture. Semblable à w+ car il créera un nouveau fichier si le fichier n'existe pas. Sinon, le pointeur de fichier se trouve à la fin du fichier s'il existe.

  • 'ab+' - mode d'ajout et de lecture en binaire. La même chose que a+ sauf que les données sont en binaire.

     with open(filename, 'r') as f:
         f.read()
     with open(filename, 'w') as f:
         f.write(filedata)
     with open(filename, 'a') as f:
         f.write('\n' + newdata)
    
r r + w w + une un +
Lis
Écrire
Crée un fichier
Efface le fichier
Position initiale Début Début Début Début Fin Fin

Python 3 a ajouté un nouveau mode de exclusive creation pour que vous ne puissiez pas tronquer ou écraser accidentellement un fichier existant.

  • 'x' - ouvert pour la création exclusive, soulèvera FileExistsError si le fichier existe déjà
  • 'xb' - ouvert pour le mode d'écriture de création exclusif en binaire. La même chose que x sauf que les données sont en binaire.
  • 'x+' - mode lecture et écriture. Semblable à w+ car il créera un nouveau fichier si le fichier n'existe pas. Sinon, FileExistsError .
  • 'xb+' - mode d’écriture et de lecture. La même chose que x+ mais les données sont binaires
X x +
Lis
Écrire
Crée un fichier
Efface le fichier
Position initiale Début Début

Permettez à quelqu'un d'écrire votre code ouvert de manière plus pythonique:

Python 3.x 3.3
try:
    with open("fname", "r") as fout:
        # Work with your open file
except FileExistsError:
    # Your error handling goes here

En Python 2, vous auriez fait quelque chose comme

Python 2.x 2.0
import os.path
if os.path.isfile(fname):
    with open("fname", "w") as fout:
        # Work with your open file
else:
    # Your error handling goes here

Lecture d'un fichier ligne par ligne

La manière la plus simple d'itérer ligne par ligne sur un fichier:

with open('myfile.txt', 'r') as fp:
    for line in fp:
        print(line)

readline() permet un contrôle plus granulaire de l'itération ligne par ligne. L'exemple ci-dessous est équivalent à celui ci-dessus:

with open('myfile.txt', 'r') as fp:
    while True:
        cur_line = fp.readline()
        # If the result is an empty string
        if cur_line == '':
            # We have reached the end of the file
            break
        print(cur_line)

Utiliser l'itérateur for loop et readline () ensemble est considéré comme une mauvaise pratique.

Plus communément, la méthode readlines() est utilisée pour stocker une collection itérable des lignes du fichier:

with open("myfile.txt", "r") as fp:
    lines = fp.readlines()
for i in range(len(lines)):
    print("Line " + str(i) + ": " + line)

Cela imprimerait ce qui suit:

Ligne 0: bonjour

Ligne 1: monde

Obtenir le contenu complet d'un fichier

La méthode préférée du fichier i / o consiste à utiliser le mot-clé with . Cela garantira que le descripteur de fichier est fermé une fois la lecture ou l'écriture terminée.

with open('myfile.txt') as in_file:
    content = in_file.read()

print(content)

ou, pour gérer la fermeture du fichier manuellement, vous pouvez renoncer with et simplement appeler close vous:

in_file = open('myfile.txt', 'r')
content = in_file.read()
print(content)
in_file.close()

Gardez à l'esprit que, sans utiliser une instruction with , vous risquez de garder le fichier ouvert par inadvertance au cas où une exception inattendue se présenterait comme suit:

in_file = open('myfile.txt', 'r')
raise Exception("oops")
in_file.close()  # This will never be called

Ecrire dans un fichier

with open('myfile.txt', 'w') as f:
    f.write("Line 1")
    f.write("Line 2")
    f.write("Line 3")
    f.write("Line 4")

Si vous ouvrez myfile.txt , vous verrez que son contenu est le suivant:

Ligne 1 Ligne 2 Ligne 3 Ligne 4

Python n'ajoute pas automatiquement les sauts de ligne, vous devez le faire manuellement:

with open('myfile.txt', 'w') as f:
    f.write("Line 1\n")
    f.write("Line 2\n")
    f.write("Line 3\n")
    f.write("Line 4\n")

Ligne 1
Ligne 2
Ligne 3
Ligne 4

N'utilisez pas os.linesep comme terminateur de ligne lorsque vous écrivez des fichiers ouverts en mode texte (valeur par défaut); utilisez plutôt \n

Si vous voulez spécifier un encodage, vous ajoutez simplement le paramètre d' encoding à la fonction open :

with open('my_file.txt', 'w', encoding='utf-8') as f:
    f.write('utf-8 text')

Il est également possible d'utiliser l'instruction print pour écrire dans un fichier. La mécanique est différente dans Python 2 vs Python 3, mais le concept est le même en ce sens que vous pouvez prendre la sortie qui serait allée à l'écran et l'envoyer à un fichier à la place.

Python 3.x 3.0
with open('fred.txt', 'w') as outfile:
    s = "I'm Not Dead Yet!"
    print(s) # writes to stdout
    print(s, file = outfile) # writes to outfile

    #Note: it is possible to specify the file parameter AND write to the screen
    #by making sure file ends up with a None value either directly or via a variable
    myfile = None
    print(s, file = myfile) # writes to stdout
    print(s, file = None)   # writes to stdout

En Python 2, vous auriez fait quelque chose comme

Python 2.x 2.0
outfile = open('fred.txt', 'w')
s = "I'm Not Dead Yet!"
print s   # writes to stdout
print >> outfile, s   # writes to outfile

Contrairement à la fonction d'écriture, la fonction d'impression ajoute automatiquement des sauts de ligne.

Copier le contenu d'un fichier dans un fichier différent

with open(input_file, 'r') as in_file, open(output_file, 'w') as out_file:
    for line in in_file:
        out_file.write(line)
  • En utilisant le module shutil :
import shutil
shutil.copyfile(src, dst)

Vérifiez si un fichier ou un chemin existe

Utilisez le style de codage EAFP et try de l'ouvrir.

import errno

try:
    with open(path) as f:
        # File exists
except IOError as e:
    # Raise the exception if it is not ENOENT (No such file or directory)
    if e.errno != errno.ENOENT:
        raise
    # No such file or directory

Cela évitera également les conditions de concurrence si un autre processus supprime le fichier entre la vérification et le moment où il est utilisé. Cette condition de concurrence peut survenir dans les cas suivants:

  • En utilisant le module os :

    import os
    os.path.isfile('/path/to/some/file.txt')
    
Python 3.x 3.4
  • En utilisant pathlib :

    import pathlib
    path = pathlib.Path('/path/to/some/file.txt')
    if path.is_file():
        ...
    

Pour vérifier si un chemin donné existe ou non, vous pouvez suivre la procédure EAFP ci-dessus ou vérifier explicitement le chemin:

import os
path = "/home/myFiles/directory1"

if os.path.exists(path):
    ## Do stuff

Copier une arborescence de répertoires

import shutil
source='//192.168.1.2/Daily Reports'
destination='D:\\Reports\\Today'
shutil.copytree(source, destination)  

Le répertoire de destination ne doit pas déjà exister .

Itérer les fichiers (récursivement)

Pour itérer tous les fichiers, y compris les sous-répertoires, utilisez os.walk:

import os
for root, folders, files in os.walk(root_dir):
    for filename in files:
        print root, filename

root_dir peut être "." pour démarrer à partir du répertoire en cours ou de tout autre chemin à partir duquel commencer.

Python 3.x 3.5

Si vous souhaitez également obtenir des informations sur le fichier, vous pouvez utiliser la méthode plus efficace os.scandir comme suit :

for entry in os.scandir(path):
   if not entry.name.startswith('.') and entry.is_file():
       print(entry.name)

Lire un fichier entre plusieurs lignes

Supposons donc que vous souhaitiez effectuer une itération uniquement entre certaines lignes spécifiques d'un fichier

Vous pouvez utiliser les itertools pour cela

import itertools

with open('myfile.txt', 'r') as f:
    for line in itertools.islice(f, 12, 30):
        # do something here

Cela lira les lignes 13 à 20, car l'indexation en python commence à 0. Le numéro de ligne 1 est donc indexé à 0

Comme peut également lire certaines lignes supplémentaires en utilisant le mot clé next() ici.

Et lorsque vous utilisez l'objet fichier comme une itération, n'utilisez pas l'instruction readline() car les deux techniques de déplacement d'un fichier ne doivent pas être mélangées.

Accès aléatoire aux fichiers à l'aide de mmap

L'utilisation du module mmap permet à l'utilisateur d'accéder de manière aléatoire aux emplacements d'un fichier en mappant le fichier en mémoire. Ceci est une alternative à l'utilisation des opérations de fichier normales.

import mmap

with open('filename.ext', 'r') as fd:
    # 0: map the whole file
    mm = mmap.mmap(fd.fileno(), 0)

    # print characters at indices 5 through 10
    print mm[5:10]

    # print the line starting from mm's current position
    print mm.readline()

    # write a character to the 5th index
    mm[5] = 'a'

    # return mm's position to the beginning of the file
    mm.seek(0)

    # close the mmap object
    mm.close()

Remplacement du texte dans un fichier

import fileinput

replacements = {'Search1': 'Replace1',
                'Search2': 'Replace2'}

for line in fileinput.input('filename.txt', inplace=True):
    for search_for in replacements:
        replace_with = replacements[search_for]
        line = line.replace(search_for, replace_with)
    print(line, end='')

Vérifier si un fichier est vide

>>> import os
>>> os.stat(path_to_file).st_size == 0

ou

>>> import os    
>>> os.path.getsize(path_to_file) > 0

Cependant, les deux lanceront une exception si le fichier n'existe pas. Pour éviter d'avoir à attraper une telle erreur, procédez comme suit:

import os
def is_empty_file(fpath):  
    return os.path.isfile(fpath) and os.path.getsize(fpath) > 0

qui renverra une valeur bool .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow