Chaine de caractère en python

Fermé
ccdms Messages postés 2 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 9 janvier 2008 - 8 janv. 2008 à 00:08
 mmrad1 - 21 févr. 2013 à 15:01
Bonjour tout le monde,
je suis débutant en python et je veux un coup de main:
je veux construire une matrice d'entiers à partir d'un fichier texte contenant les valeurs à stoker dans la matrice.
j'ai essayé de la façon suivante:
def creerMatrice(fichier):
""" Creation de la matrice a partir du fichier texte"""
f = open(fichier,"r")
matrice = f.readlines()
f.close()
return matrice

Le problème est que je ne peux pas modifier la mtrice obtenue:
par exemple: matrice[i][j] = x
TypeError: 'str' object does not support item assignment.
A voir également:

6 réponses

jooshig Messages postés 40 Date d'inscription lundi 30 octobre 2006 Statut Membre Dernière intervention 9 janvier 2008 9
9 janv. 2008 à 03:15
# obtention des données
f = open('matrice',"r")
lignes = f.readlines()
f.close()

# définition d'une matrice vide
NL = len(lignes)
NC = len(lignes[0])
if NL>1:
    NC = NC-1
print 'N_Lignes =',NL,'  N_Colonnes =',NC
m = {}
for i in range(1,NL+1):
    m[i] = {}

# remplissage de la matrice
for i in range(1,NL+1):
    for j in range(1,NC+1):
        m[i][j] = int(lignes[i-1][j-1])

# affichage de la matrice remplie
print '\nMatrice créée:'
for i in range(1,NL+1):
    for j in range(1,NC+1):
        print m[i][j],
    print ''

    print ''



lignes est une liste des lignes présentes dans le fichier 'matrice'
NL = len(lignes) la longueur de la liste correspond au nombre d'éléments de la liste
NC = len(lignes[0]) le nombre de caractères de la première ligne (numérotée 0) est le nombre de colonnes à condition que toutes les lignes du fichier aient le même nombre de caractères
if NL>1: NC = NC-1 Il faut soustraire 1 à la longueur de la ligne pour tenir compte de la présence du signe de retour à la ligne (la plupart du temps invisible), car readlines() lit tous les caractères y compris celui de retour à la ligne. Pour voir le signe de retour à la ligne (qui est noté \n), il faut faire print lignes. Mais ceci n'est vrai que s'il n'y a pas qu'une seule ligne dans le fichier, sinon lignes ne comporte qu'une seule ligne sans le signe de retour à la ligne à la fin.

m = {} crée un dictionnaire vide
for i in range(1,NL+1): m[i] = {} définit NL éléments pour le dictionnaire m et les définit comme étant eux même des dictionnaires.
À ce stade, m est donc un dictionnaire de NL dictionnaires, ces derniers étant de longueurs encore indéfinies.

m[i][j] = int(lignes[i-1][j-1])
La numérotation des lignes et des colonnes de la matrice commence à 1, tandis que le premier élément de la liste 'lignes' est numéroté 0 et que le premier caractère de chaque ligne est numéroté 0.

-----------------------------

Il serait aussi possible de définir la matrice comme un dictionnaire de listes.

dicli = {}
for i in range(1,NL+1):
    dicli[i] = []
for i in range(1,NL+1):
    for j in range(1,NC+1):
        dicli[i].append(int(lignes[i-1][j-1]))

print '\nMatrice dict de listes'
for i in range(1,NL+1):
    for j in range(1,NC+1):
        print dicli[i][j-1],
    print ''


Mais le remplacement d'un élément d'une telle matrice serait compliqué par le fait qu'on ne peut pas facilement insérer ou remplacer un élément à une position donnée dans une liste. Un dictionnaire de dictionnaire est le mieux je pense.
4
tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008
31 mars 2008 à 12:17
bonjour,
Le code que vous avez posté est vraiment interaissant mais ça m'a généré une erreur à la ligne:
m[i][j] = int(lignes[i-1][j-1])
-->"invalid literal for int() with base 10:'a'"
cette erreur m'a apparu non seulement avec votre code mais aussi à chaque fois que j'utilise j i et leur boucle
J'ai ajouté import numpy-----> "No module named numpy"

Q'est ce que je dois faire. C'est très important.
Quelle est la format de votre fichier .txt
Merci
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655 > tsic Messages postés 20 Date d'inscription jeudi 7 février 2008 Statut Membre Dernière intervention 20 juin 2008
31 mars 2008 à 12:25
"invalid literal for int() with base 10:'a'"

vous essayez de convertir la lettre 'a' en nombre.
Je présume que ce 'a' est présent dans votre fichier.
0
darkneurone Messages postés 39 Date d'inscription dimanche 11 mars 2007 Statut Membre Dernière intervention 12 juin 2008 12
8 janv. 2008 à 00:27
Bonsoir,

euh je ne comprends pas trop ton problème.. Mais ici, c'est normal que tu obtiennes cette erreur puisque la fonction .readlines() te renvoie un string.

En gros, tu essayes de lire un fichier, de lire les données qui sont dedant, et de les stocker dans une matrice ? Si tu sais comment sont rangées les données dans le fichier, tu as juste à recupérer le nombre de caractère avec .read(NbChar) et jouer avec le curseur. Sinon tu peux récupérer tout le contenu du fichier et l'analyser en utilisant le module 'string' ou 're' (pour les expressions régulières).

Enfin bref, tout dépend de comment sont stockées tes données dans le fichier..

Par contre, il y a un problème plus important, c'est que python ne peux gérer autre chose (de base) que des tableaux unidimensionnels. Tu peux en revanche utiliser une librairie spécialisée dans les opérations mathématiques, entre autres les matrices : NumPy

Bonne soirée/journée ^^

NB : un peu de doc pour NumPy : https://docs.scipy.org/doc/

EDIT : Oops j'y avais pas pensé !
2
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
8 janv. 2008 à 10:14
Effectivement, NumPy est la meilleure solution pour travailler avec des matrice.

Maintenant, ccdms, on ne connaît pas la structure de ton fichier, on ne peut donc rien dire.

Est-ce qu'il y a une ligne dans le fichier texte par ligne de matrice ?
Les valeurs sont-elles séparées par des espaces, ou d'autres caractères ?
2
Utilisateur anonyme
8 janv. 2008 à 00:21
logique, matrice est une liste de ligne (cf http://docs.python.org/lib/bltin-file-objects.html) et non un tableau

def creerMatrice(fichier):
""" Creation de la matrice a partir du fichier texte"""
f = open(fichier,"r")
matrice = f.readlines().split(" ");
f.close()
return matrice

Cela devrai te retrouner une liste de liste... donc une sorte de matrice
1
ccdms Messages postés 2 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 9 janvier 2008
9 janv. 2008 à 00:46
merci de la réponse: oui c'est bien une liste de liste car si j'essaye de l'afficher avec cette fonction:
def afficher(matrice):
ligne,colonne = len(matrice),len(matrice[0])-1
for i in range(ligne):
for j in range(colonne):
print matrice[i][j],
print

j'ai bien le contenu de la matrice. Mais le problème est que je veux avoir une matrice que je peux modifier (changer la valeur d'un élément "matrice[i][j]" ) après la création de la matrice. j'ai créé sur le Shell directement des matrices( liste de listes) d'entiers et là la modification des valeurs passe sans problème.
En d'autres termes on me donne une matrice d'entiers (que des 0 et des 1)à manipuler mais la matrice est donnée sous forme d'un fichier de texte dont les lignes représentent les lignes de la matrice par exemple: ces 4 lignes d'un fichier texte "fichier.txt"
01010100
01010010
10110111
01010010
représentent une matrice d'entiers de 4 lignes et 8 colonnes qu'il faut récupérer et manipuler par la suite.
comment faire de sorte à avoir une liste de listes d'entiers au lieu d'une liste de strings.
merci.
0
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655 > ccdms Messages postés 2 Date d'inscription lundi 7 janvier 2008 Statut Membre Dernière intervention 9 janvier 2008
9 janv. 2008 à 09:21
Si tes données 0010001... sont stockées dans un fichier "matrice.txt", ça donne:

import numpy

donnees = []

for ligne in file("matrice.txt"):
	donnees.append( [int(i) for i in ligne.strip()] )

a = numpy.array(donnees)
a[2][3] = 5
print a
print a[2][3]


Ce qui affiche:
[[0 1 0 1 0 1 0 0]
 [0 1 0 1 0 0 1 0]
 [1 0 1 5 0 1 1 1]
 [0 1 0 1 0 0 1 0]]
5
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebsauvage Messages postés 32893 Date d'inscription mercredi 29 août 2001 Statut Modérateur Dernière intervention 21 octobre 2019 15 655
31 mars 2008 à 13:09
J'ai ajouté import numpy-----> "No module named numpy"

Il faut aller télécharget et installer Numpy.
Il ne fait pas partie de la version standard de Python.
0
Je n'ai pas compris!
0