web-dev-qa-db-fra.com

Comment lire les nombres d'un fichier en Python?

J'aimerais lire les nombres d'un fichier dans un tableau à deux dimensions.

Contenu du fichier:

  • ligne contenant w, h
  • h lignes contenant w nombres entiers séparés par un espace

Par exemple:

4 3
1 2 3 4
2 3 4 5
6 7 8 9
44
kravemir

En supposant que vous n'avez pas d'espaces blancs superflus:

with open('file') as f:
    w, h = [int(x) for x in next(f).split()] # read first line
    array = []
    for line in f: # read rest of lines
        array.append([int(x) for x in line.split()])

Vous pouvez condenser la dernière boucle for en une compréhension de liste imbriquée:

with open('file') as f:
    w, h = [int(x) for x in next(f).split()]
    array = [[int(x) for x in line.split()] for line in f]
71
zeekay

Pour moi, ce genre de problème apparemment simple est l’objet de Python. Surtout si vous venez d'un langage comme le C++, où la simple analyse de texte peut être pénible, vous apprécierez vraiment la solution fonctionnelle par unité que python peut vous apporter. Je le garderais très simple avec quelques fonctions intégrées et des expressions de générateur.

Vous aurez besoin de open(name, mode), myfile.readlines(), mystring.split(), int(myval), et vous voudrez probablement utiliser deux générateurs pour rassemblez-les tous d'une manière pythonique.

# This opens a handle to your file, in 'r' read mode
file_handle = open('mynumbers.txt', 'r')
# Read in all the lines of your file into a list of lines
lines_list = file_handle.readlines()
# Extract dimensions from first line. Cast values to integers from strings.
cols, rows = (int(val) for val in lines_list[0].split())
# Do a double-nested list comprehension to get the rest of the data into your matrix
my_data = [[int(val) for val in line.split()] for line in lines_list[1:]]

Recherchez les expressions du générateur ici . Ils peuvent vraiment simplifier votre code en unités fonctionnelles discrètes! Imaginez faire la même chose en 4 lignes en C++ ... Ce serait un monstre. En particulier les générateurs de liste, quand j'étais C++, j'avais toujours souhaité avoir quelque chose comme ça, et je finissais souvent par créer des fonctions personnalisées pour construire chaque type de tableau de mon choix.

13
machine yearning

Vous ne savez pas pourquoi vous avez besoin de w, h. Si ces valeurs sont réellement requises et signifient que seul le nombre spécifié de lignes et de colonnes doit être lu, vous pouvez essayer les solutions suivantes:

output = []
with open(r'c:\file.txt', 'r') as f:
    w, h  = map(int, f.readline().split())
    tmp = []
    for i, line in enumerate(f):
        if i == h:
            break
        tmp.append(map(int, line.split()[:w]))
    output.append(tmp)
3
Artsiom Rudzenka