> Les bases > Le langage > Fichiers
Fichiers
Ouverture d'un fichier : fh = open('/tmp/toto', 'w') : le mode peut être 'r' pour read ('r' fournit des strings, 'rb' fournit des bytes), 'w' pour write, 'a' pour append, 'r+' pour read et write, ou omis (read par défaut).
attention, sous windows, il y a aussi les modes 'rb', 'wb', 'r+b' avec b pour binaire : en effet, en mode ascii, les retours chariots sont altérés, en mode binaire, ils ne le sont pas !
Fonctions sur les file handles :
- fh.read(1000) : lit 1000 caractères.
- content = fh.read() : lit tout le fichier (ou le reste) (chaîne vide si fichier fini).
- attention : fh.read() est bloquant. Si ce qu'on lit est en cours d'écriture, il va attendre que l'EOF final soit disponible ! Si on veut faire un read non bloquant, il faut transformer le file handle en non bloquant : import fcntl; fcntl.fcntl(fh, fcntl.F_SETFL, fcntl.fcntl(fh, fcntl.F_GETFL) | os.O_NONBLOCK)
- fh.readline() : lit la ligne suivante (chaîne vide si fichier fini).
- fh.readlines() : renvoie une liste de toutes les lignes.
- fh.write('myString') : écrit une string
- fh.tell() : renvoie la position courante dans le fichier.
- fh.close() : ferme le fichier
- fh.seek(offset, from_what) : repositionne le curseur :
- si from_what = 0 : offset à partir du début
- si from_what = 1 : offset à partir de la position courante
- si from_what = 2 : offset à partir de la fin
- si from_what omis : il vaut 0.
(offset peut être négatif)
Pour boucler sur les lignes d'un fichier :
fh = open('myFile')
for line in fh:
print(line)
attention : ça fait du buffering, contrairement à un simple readline() ! Donc utiliser readline() si on veut l'éviter.
On peut récupérer directement la liste des lignes d'un fichier en faisant : [x.replace('
', '') for x in open('myFile')
Lecture d'un fichier avec fermeture automatique de celui-ci à la fin, comme s'il y avait un finally (même en cas d'exception) :
with open('myfile.txt') as fh:
for line in fh:
print(line)
Diverses fonctions :
- os.environ : renvoie un dictionnaire de tous les variables d'environnement avec leur valeur
- os.getcwd() : renvoie le directory courant.
- os.chdir(myDir) : change le directory courant.
- os.getuid(), os.geteuid(), os.getgid(), os.getegid() : renvoient les uid ou gid, ou les uid ou gid effectifs
- os.getlogin() : renvoie le login.
- os.getpid() : renvoie le process id (PID).
- os.getenv('MY_VAR'), os.putenv('MY_VAR', '1'), os.unsetenv('MY_VAR') lit, fixe ou détruit une variable d'environnement (valable pour les sous-process lancés)
- os.umask(0o002) : positionne le umask à 002. Attention, un nombre en octal doit être précédé de 0o !
- os.chmod('myfile', 0o755) : fait un changement des droits. Attention, un nombre en octal doit être précédé de 0o !
- os.uname() : renvoie un tuple avec les infos de uname.
- os.listdir('/myDir') : renvoie la liste des fichiers (entrées) du directory.
- os.mkdir(myDir) : crée un directory. os.mkdir(myDir, 0o777) en indiquant le mode, mais en appliquant par dessus le umask qui vient restreindre les droits. Lève une exception si le directory existe déjà.
- os.makedirs(myDir) : crée le directory en créant tous les intermédiaires si nécessaire.
- os.remove(myFile) : détruit un fichier (pas un directory).
- os.unlink(myFile) : comme os.remove().
- os.rmdir(myDir) : détruit un directory seulement s'il est vide.
- os.removedirs(myDir) : détruit un directory et si son parent est vide, le détruit aussi et remonte comme ça toute l'arborescence jusqu'à un directory non vide. Pour détruire un directory et tout ce qu'il contient, utiliser shutil.rmtree
- os.rename(oldFile, newFile) : renomme un fichier ou directory. Attention : écrase le fichier destination s'il existe ! Attention : ne marche pas entre filesystems (utiliser shutil.move() pour cela).
- os.symlink(myFile, myLink) : crée un lien symbolique.
- os.symlink('myFile', '/myDir/myFile2') : Pour faire un lien relatif de myFile vers myFile2 dans le directory /myDir
- os.link(myFile, myLink) : crée un hard lien (spécifique unix/linux).
- os.walk(myDir) : renvoie un generator qui renvoie à chaque fois un tuple avec (dirpath, dirnames, filenames) où dirpath est le directory courant (chemin complet à partir de myDir inclus), dirnames la liste de tous les sous-directories, et filenames la liste des fichiers (sans les directories).
for dirpath, dirnames, filenames in os.walk('docs'):
print(dirpath, dirnames, filenames)
- os.stat(myFile) : permet d'avoir les infos sur l'inode comme la date de dernière modification, la taille du fichier ou le user :
import stat
print(os.stat(myFile)[stat.ST_MTIME])
- stat.ST_UID : le user id
- stat.ST_GID : le group id
- stat.ST_SIZE : la taille
- stat.ST_ATIME : le timestamp de la dernière date d'accès.
- stat.ST_MTIME : le timestamp de la dernière date de modification
- accès en lecture ou écriture :
- Pour tester si un directory peut être écrit : os.access(myDir, os.W_OK | os.X_OK)
- Pour tester si un fichier peut être lu : os.access(myFile, os.R_OK)
- os.kill(myPid, 9) : kill le process (utiliser import signal; os.kill(myPid, signal.SIGKILL) pour être plus propre.
Appels systèmes :
- os.system(myCommand) : avec retour du statut, mais on ne peut pas récupérer le stdout du programme appelé. Cette méthode est déconseillée.
- l'appel est bloquant.
- voir aussi le module subprocess
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert