Python Language Entrée d'un fichier


Exemple

L'entrée peut également être lue à partir de fichiers. Les fichiers peuvent être ouverts en utilisant la fonction intégrée open . Utiliser une syntaxe with <command> as <name> syntaxe with <command> as <name> (appelée «gestionnaire de contexte») simplifie grandement l’utilisation de open et l’obtention d’un handle pour le fichier:

with open('somefile.txt', 'r') as fileobj:
    # write code here using fileobj

Cela garantit que, lorsque l'exécution du code quitte le bloc, le fichier est automatiquement fermé.

Les fichiers peuvent être ouverts dans différents modes. Dans l'exemple ci-dessus, le fichier est ouvert en lecture seule. Pour ouvrir un fichier existant à des fins de lecture, utilisez uniquement r . Si vous voulez lire ce fichier en octets, utilisez rb . Pour ajouter des données à un fichier existant, utilisez a . Utilisez w pour créer un fichier ou écraser les fichiers existants du même nom. Vous pouvez utiliser r+ pour ouvrir un fichier à la fois pour la lecture et l'écriture. Le premier argument de open() est le nom du fichier, le second est le mode. Si le mode est laissé vide, la valeur par défaut sera r .

# let's create an example file:
with open('shoppinglist.txt', 'w') as fileobj:
    fileobj.write('tomato\npasta\ngarlic')

with open('shoppinglist.txt', 'r') as fileobj:
    # this method makes a list where each line 
    # of the file is an element in the list
    lines = fileobj.readlines()

print(lines)
# ['tomato\n', 'pasta\n', 'garlic']

with open('shoppinglist.txt', 'r') as fileobj:
    # here we read the whole content into one string:
    content = fileobj.read()
    # get a list of lines, just like int the previous example:
    lines = content.split('\n')

print(lines)
# ['tomato', 'pasta', 'garlic']

Si la taille du fichier est infime, il est prudent de lire tout le contenu du fichier en mémoire. Si le fichier est très volumineux, il est souvent préférable de lire ligne par ligne ou par morceaux et de traiter l'entrée dans la même boucle. Pour faire ça:

with open('shoppinglist.txt', 'r') as fileobj:
    # this method reads line by line:
    lines = []
    for line in fileobj:
        lines.append(line.strip())

Lors de la lecture de fichiers, tenez compte des caractères de saut de ligne spécifiques au système d'exploitation. Bien que for line in fileobj , il est automatiquement supprimé, il est toujours prudent d'appeler strip() sur les lignes lues, comme indiqué ci-dessus.

Les fichiers ouverts ( fileobj dans les exemples ci-dessus) pointent toujours vers un emplacement spécifique du fichier. Lorsqu'ils sont ouverts pour la première fois, le descripteur de fichier pointe au tout début du fichier, qui correspond à la position 0 . Le handle de fichier peut afficher sa position actuelle avec tell :

fileobj = open('shoppinglist.txt', 'r')
pos = fileobj.tell()
print('We are at %u.' % pos) # We are at 0.

En lisant tout le contenu, la position du gestionnaire de fichiers sera pointée à la fin du fichier:

content = fileobj.read()
end = fileobj.tell()
print('This file was %u characters long.' % end)
# This file was 22 characters long.
fileobj.close()

La position du gestionnaire de fichiers peut être définie selon vos besoins:

fileobj = open('shoppinglist.txt', 'r')
fileobj.seek(7)
pos = fileobj.tell()
print('We are at character #%u.' % pos)

Vous pouvez également lire n'importe quelle longueur du contenu du fichier pendant un appel donné. Pour cela, passez un argument pour read() . Lorsque read() est appelé sans argument, il sera lu jusqu'à la fin du fichier. Si vous passez un argument, il lira ce nombre d'octets ou de caractères, en fonction du mode ( rb et r respectivement):

# reads the next 4 characters 
# starting at the current position
next4 = fileobj.read(4)
# what we got?
print(next4) # 'cucu'
# where we are now?
pos = fileobj.tell()
print('We are at %u.' % pos) # We are at 11, as we was at 7, and read 4 chars.

fileobj.close()

Pour démontrer la différence entre les caractères et les octets:

with open('shoppinglist.txt', 'r') as fileobj:
    print(type(fileobj.read())) # <class 'str'>

with open('shoppinglist.txt', 'rb') as fileobj:
    print(type(fileobj.read())) # <class 'bytes'>