Python Language
Fichiers et dossiers E / S
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 à utiliserr
etw
.'rb+'
- mode lecture et écriture en binaire. La même chose quer+
sauf que les données sont en binaire'wb'
- mode d’écriture en binaire. La même chose quew
sauf que les données sont en binaire.'w+'
- mode d'écriture et de lecture. Le même quer+
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 quew+
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 quea+
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èveraFileExistsError
si le fichier existe déjà -
'xb'
- ouvert pour le mode d'écriture de création exclusif en binaire. La même chose quex
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 quex+
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:
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
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.
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
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')
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.
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
.