Posez votre question Signaler

Chaine de caractère en python

ccdms 2Messages postés lundi 7 janvier 2008Date d'inscription 9 janvier 2008Dernière intervention - Dernière réponse le 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.
Lire la suite 
Réponse
+4
moins plus
# 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.
tsic 20Messages postés jeudi 7 février 2008Date d'inscription 20 juin 2008Dernière intervention - 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
Répondre
sebsauvage 33290Messages postés mercredi 29 août 2001Date d'inscription ModérateurStatut 26 mars 2015Dernière intervention - 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.
Répondre
Ajouter un commentaire
Réponse
+2
moins plus
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 : http://www.scipy.org/Documentation

EDIT : Oops j'y avais pas pensé !
Ajouter un commentaire
Réponse
+2
moins plus
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 ?
Ajouter un commentaire
Réponse
+1
moins plus
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
ccdms 2Messages postés lundi 7 janvier 2008Date d'inscription 9 janvier 2008Dernière intervention - 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.
Répondre
sebsauvage 33290Messages postés mercredi 29 août 2001Date d'inscription ModérateurStatut 26 mars 2015Dernière intervention - 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
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
Ajouter un commentaire
Ce document intitulé «  chaine de caractère en python  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.