IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

optimisation lecture fichier .txt


Sujet :

Python

  1. #1
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut optimisation lecture fichier .txt
    Bonjour,
    Dans le cadre d'un développement d'extension QGIS (Python 2.7, librairies PyQt4), j'ai besoin de lire plusieurs (essentiellement 2) énormes fichiers .txt (environ 140 Mo) pour les intégrer dans une base de données.
    Voici le code utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fichier = open(unicode(pathFichier), "r")
    	for ligne in fichier:
    		ligne = ligne.decode('utf8')
    		chaines = ligne.split(";")
                    """ puis traitement des différents éléments de chaines"""
    Y aurait il une possibilité moins gourmande en temps? J'ai cru comprendre que Python mettait déjà le fichier en mémoire cache lorsque qu'il l'ouvre dans "fichier".
    Comment optimiser la lecture pour un très gros fichier?

    Merci.

  2. #2
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Salut,

    Citation Envoyé par maudJ Voir le message
    Bonjour,
    Y aurait il une possibilité moins gourmande en temps?
    Une première possibilité serait de mettre chaque ligne de ton fichier dans une liste ou dans un dictionnaire.
    Pour choisir entre liste ou dictionnaire, faudrait savoir ce que tu traite comme données.
    Ensuite tu parcours cette liste ou ce dico pour traiter tes chaines.

    Comment optimiser la lecture pour un très gros fichier?
    Je pense que cela dépend de tes données.
    Dans des cas que j'ai traités avec des fichiers de plus centaines de milliers de lignes, je transférais tout mon fichier dans un tableau et ensuite je travaillais sur le tableau, alors qu'au départ je travaillais directement lignes par lignes depuis mon fichier, le temps c'est vue être diviser par 5.
    Ensuite tout dépend également de la machine sur laquelle ton script va tourner, et si tu es en 32bits ou en 64bits.

  3. #3
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Merci pour cette info. Voici le traitement que je fais des données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	#traitement
    	if nbCh>=5 and self.verifTableGen(chaines[1], chaines[2]):
    			if nbCh == 5:
    				chaines.append(0)	
    			listDonnees.append((nbEnreg, chaines[1], chaines[2], chaines[3], chaines[4], chaines[5]))
                            nbEnreg += 1
    en gros je récupère des données que j'insère dans une liste pour former les valeurs nécessaire à l'insert de sqlite.
    verifTableGen vérifie que les premières données sont bien dans la base de donnée. Le fichier fourni a chaque ligne commençant par un ; c'est pourquoi je commence à 1 la lecture.
    Je pense que l'utilisation d'une liste serait mieux vu ce que j'en fais ensuite, non?

  4. #4
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par maudJ Voir le message
    Merci pour cette info. Voici le traitement que je fais des données:
    Je pense que l'utilisation d'une liste serait mieux vu ce que j'en fais ensuite, non?
    C'est à vous de faire le test et constater s'il y a une amélioration ou pas.

  5. #5
    Membre averti

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Points : 351
    Points
    351
    Par défaut
    Bonjour,

    En principe, les ETL (logiciel couramment utilisé dans ce genre de tâches) ne mettent pas la totalité du fichier en mémoire. Ils travaillent par séquence (nombre de ligne), un peu comme du streaming, bout par bout. Par contre, cela n'est envisageable que si vous n'avez pas à faire de traitement bloquant sur vos données. Par exemple, si vous devez faire un tri ou une agrégation, obligatoirement vous devez récupérer la totalité des données.

    Vous pourriez peut être envisager le traitement puis l'insertion des données à chaque ligne, en itérant notamment avec yield (générateur), cela résoudra vos problèmes de mémoire, un exemple ici : http://sametmax.com/comment-utiliser...urs-en-python/

    Vous avez également deux articles sympathiques ici http://www.chicoree.fr/w/Lire_et_%C3...te_avec_Python et ici http://www.chicoree.fr/w/Fichiers_CSV_en_Python.

    Avec sqlite, je ne sais pas, mais avec de vraies base de données, on peut faire des insertions en masse (bulk insert), par exemple pour sql server : https://msdn.microsoft.com/fr-fr/lib...=sql.120).aspx

  6. #6
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    Merci pour ces réponses. Vu ce que je fais des données en fait le plus efficace serait d'importer directement un fichier csv dans ma table sqlite.
    Problème: je suis en Python 2.7 et toutes les aides concernant cette manip indique python 3. Serait-ce qu'il n'est pas possible de le faire en Python 2.7?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par maudJ Voir le message
    Merci pour ces réponses. Vu ce que je fais des données en fait le plus efficace serait d'importer directement un fichier csv dans ma table sqlite.
    Problème: je suis en Python 2.7 et toutes les aides concernant cette manip indique python 3. Serait-ce qu'il n'est pas possible de le faire en Python 2.7?
    "importer directement un fichier csv dans ma table sqlite" se fait avec des commandes du shell sqlite (pas besoin de Python)... poster au moins une URL qui décrit ce dont vous parlez aiderait à comprendre ce que vous racontez.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    En fait désolée, ce midi je n'avais pas les yeux en face des trous, j'ai lu python3 au lieu de SQLite3, du coup je ne comprenais pas...

    Je cherche en fait à lire un fichier .csv ou .txt en python (extension QGIS) pour insérer les données dans une table spatialite (sqlite).
    J'ai un fichier créé sous excel avec plusieurs lignes d'entête. Ensuite j'ai toutes les données, chaque ligne correspondant à une entrée de ma table, avec les champs séparés par un ";" et le début de ligne commençant également par un ";".
    ;1;8;0.680000;15.250000
    Il y a 1 047 494 lignes et 5 colonnes dans le fichier.
    Lorsque je lis le fichier en entier, ça plante, c'est trop lourd. Les deux autres possibilités (ligne par ligne avec "readline" ou en utilisant l'objet fichier), ça va mais je dois vider régulièrement la liste utilisée pour insérer les données dans sqlite sinon problème de mémoire.
    et c'est extrêmement long et laborieux.

    J'ai lu avec intérêt les liens et conseils fournis et me suis penchée sur la question du bulkinsert dont parle Patic.
    en sqlite il y a un executemany dont je me servais déjà et qui ne pose pas de problème.

    Mais le problème reste le stockage de ces données entre la lecture et l'envoi à la base sqlite.
    J'ai trouvé des docs proposant de charger directement un fichier csv dans une base sqlite avec un dicreader():

    https://stackoverflow.com/questions/...e-using-python

    mais finalement ils stockent également les données à intégrer.
    L'idée d'envoyer des données avec un yield (donc sans enregistrer) est intéressante, mais je ne peux alors pas les intégrer de manière optimisée dans la base SQLite.


    Finalement, je vais rester sur une des deux options de départ: objet fichier ou lecture ligne par ligne, et vider régulièrement (tous les 100 000 lignes ) ma liste d'insertion de données sqlite.

    Merci pour votre aide et désolée pour le message farfelu et inutile d'heure de déjeuner (mon cerveau fonctionne moins bien quand il crie famine!)

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Avez-vous lu la réponse de wiztrick ? Si oui, il me semble que vous n'avez pas compris, car votre réponse est incohérente par rapport à sa proposition. Pourquoi faire du contre productif alors qu'avec une simple commande sqlite, vous créez rapidement votre base ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Oui j'ai bien compris, mais je ne peux pas faire lancer une commande dans le shell à l'utilisateur à chaque lancement de l'extension, au moment où j'en ai besoin pour faire les calculs suivants, c'est pourquoi je passe par le langage python. A moins que je puisse lancer directement la console shell et les commandes qui vont avec depuis mon extension? Je n'ai pas trouvé.

    En fait, avant de remplir cette table X, il faut déjà que j'en remplisse une autre Y, par un autre biais, qui possède des données en lien avec les clés secondaires de la table remplie grâce au fichier.
    Et l'utilisateur ne lance que l'extension avec les adresses des fichiers en entrée et les fichiers shp chargés dans QGIS qui servent à alimenter les autres tables.

    En gros:
    1) je récupère toutes les infos en entrée (shp et fichiers txt)
    2) je remplis les tables en lien avec les données vecteur (shp)
    3) je remplis ma table à partir du fichier txt
    4) je fais mon traitement pour lier le tout, sortir ce que je veux et afficher le résultat en shp
    ensuite je vide toutes les tables. L'utilisateur ne voit jamais la partie Base de données. Il n'a aucune manip à faire de ce côté là et les bases de données ne servent qu'à faire les traitements.

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Il y a clairement des solutions adaptées, peut-être que le module pandas est ce qu'il vous faut, voir ICI. C'est une des meilleures solutions en ce qui me concerne. Il faudrait voir avec numpy aussi, module très performant.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par maudJ Voir le message
    A moins que je puisse lancer directement la console shell et les commandes qui vont avec depuis mon extension? Je n'ai pas trouvé.
    Vous pouvez toujours passer des commandes "shell" depuis Python grâce au module subprocess

    Citation Envoyé par maudJ Voir le message
    En fait, avant de remplir cette table X, il faut déjà que j'en remplisse une autre Y, par un autre biais, qui possède des données en lien avec les clés secondaires de la table remplie grâce au fichier.
    Et l'utilisateur ne lance que l'extension avec les adresses des fichiers en entrée et les fichiers shp chargés dans QGIS qui servent à alimenter les autres tables.
    Déjà si vous arrivez à faire fonctionner votre truc, c'est déjà pas si mal.
    Après, vous pouvez lancer l'opération en tâche de fond (et l'utilisateur attend que çà se termine en étant bloqué ou en faisant autre chose). Après pour aller plus vite, il faut découper les traitements en "blocks" (.readlines accepte un paramètre size qui permet de faire cela) et comme à priori vous faites beaucoup d'entrées-sorties disques, vous pouvez essayer de paralléliser un peu lectures, traitements, écritures dans la BDD avec des threads jusqu'à saturer ou occuper X % de la bande passante de vos disques (si vous saturez, les autres utilisateurs vont ramer...).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il y a clairement des solutions adaptées, peut-être que le module pandas est ce qu'il vous faut, voir ICI. C'est une des meilleures solutions en ce qui me concerne. Il faudrait voir avec numpy aussi, module très performant.
    Oui, j'ai déjà été attirée à plusieurs reprises par ce module panda... Cependant, je pensais jusque là qu'il n'était pas compatible avec PyQGIS.
    Je viens de trouver ceci
    Je vais donc regarder de plus près. Sachant que je développe sous linux mais qu'ensuite j'installerai le tout sur du windows...

    Je suis également en train d'étudier le module subprocess.
    L'utilisateur est déjà bloqué pendant le traitement. J'avais regardé du côté des threads mais j'ai encore du mal à gérer le retour pour continuer avec une autre tâche et ne pas faire cette autre tâche avant que la lecture ne soit terminée. Enfin c'est un problème de structuration à ce niveau là. Il faut réussir à "voir" en parallèle et pas en série, et je n'y suis pas encore habituée, surtout que j'avais déjà structuré mon programme avant de connaître les threads. J' étudie tout ça . merci.
    Je reviendrai quand j'aurai réussi au moins une solution.

  14. #14
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bon, voilà où j'en suis: installation de pandas, (sous linux c'est direct dans le bon dossier) puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	df = pandas.read_csv(pathFichier, sep = ';', names = ['vide', champs1, champs2, champs3, champs4], skiprows = [0, 1, 2, 3, 4, 5, 6, 7]) # ne lit pas l'entête du fichier
    	del df['vide'] # la colonne est vide
    	df.to_sql('liaison_gen', self.connectionBD, if_exists='append', index=False) # transfère le contenu du fichier dans la table
    C'est simple, efficace et bien plus rapide et moins gourmand que la méthode de lecture par lignes.
    Étant donné la lourdeur des données et des traitements, je trouve que c'est plutôt concluant! Reste à tester sur windows pour être sure.

  15. #15
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bon et bien le test sous windows n'est pas concluant. Sur deux pc différents j'ai des memory error au niveau de l'appel de la fonction pandas.
    Donc je vais tester par la console directement avec le module subprocess (solution proposée par wiztricks).
    Sinon je retournerai lire ligne par ligne... au moins ça fonctionnait, lentement mais sûrement!
    Je vous tiens au courant.

  16. #16
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    Alors je suis en traint d'étudier subprocess et les commandes shell de sqlite.
    Je suis face à une incompréhension mais je ne sais pas s'il faut que je crée un autre sujet ailleurs pour ça et si c'est dans python ou sqlite...
    Voilà le soucis:
    Je crois avoir compris que je devais faire un
    et un Là où ça se corse c'est pour les arguments.
    Dans le cas où je crée un script que j'appelle scriptImport.sqlite:
    mon script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .mod csv
    .separator ;
    .import fichier nomtable
    et là justement comment je fais pour passer le nom du fichier en variable?

    Ensuite je dois faire mon subprocess:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    arg = "sqlite nomBdd.sqlite '.read'"
    subprocess.Popen(arg,  stdin = scriptImport.sqlite')
    Là plusieurs choses me chagrinent: les cotes de chaine de caractère, le fichier en entrée alors que la commande commence par sqlite3... Va t'il comprendre que c'est pour le read?
    Je pensais utiliser les caractère %s pour dans le script sql, mais je ne sais toujours pas comment intégrer ensuite ma variable...

    Sinon j'ai trouvé ça
    ce qui m'a imspiré quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    command = "sqlite3 %s 'read %s' "% (DatabaseName, FileName)
    DumpProc = subprocess.Popen(command)
    mais j'ai toujours ce problème de nom du fichier csv en entrée à passer en variable.
    J'espère avoir été assez claire dans mon incompréhension...
    Merci.

  17. #17
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Pourquoi ne pas créer un fichier machin.sqlite avec les commandes souhaitées puis passer la commande "sqlite machin.sqlite" à Popen?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  18. #18
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Oui, ça résoudrait le problème des cotes mais il restera quand même le problème de la variable du nom de fichier à lire, non?

  19. #19
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par maudJ Voir le message
    Oui, ça résoudrait le problème des cotes mais il restera quand même le problème de la variable du nom de fichier à lire, non?
    Puisque vous fabriquez vous même le fichier "machin.sqlite", vous pouvez y écrire ce que vous voulez dedans et ce sont juste des chaînes de caractères.
    Si on peut de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .mod csv
    .separator ;
    .import fichier nomtable
    C'est pas compliqué d'en faire une chaine de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data = '''.mod csv
    .separator ;
    .import fichier nomtable'''
    puis de mettre en variables les éléments "intéressants":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data = '''.mod csv
    .separator ;
    .import %(fichier)s %(nomtable)s'''
    qu'on remplace avec le contenu de n'importe quel dico:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> fichier = 'XXX'
    >>> nomtable = 'ZZZZ'
    >>> data % vars()
    '.mod csv\n.separator ;\n.import XXX ZZZZ'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  20. #20
    Candidat au Club
    Femme Profil pro
    en reconversion
    Inscrit en
    Juillet 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : en reconversion
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2017
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Oui en fait il me manquait la méthode pour remplaçait par des variables dans la chaîne de caractère (avec %(nomVariable)s )
    Ceci dit j'aurais pu faire aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chaine = "le début de ma chaine" + variable + "suite de ma chaine".
    Mais il faut dire que je n'avais pas pensé écrire dans un fichier à chaque fois, j'étais restée figée sur comment lire un fihcier déjà écrit. Il m'a manqué la petite "étincelle"!
    Merci. je vais voir de ce côté là.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. optimiser lecture fichier image
    Par cheho dans le forum C++
    Réponses: 17
    Dernier message: 15/09/2006, 14h14
  2. lecture fichier txt
    Par stephaneamadeus dans le forum C
    Réponses: 8
    Dernier message: 28/04/2006, 18h47
  3. Lecture fichier txt
    Par licorne dans le forum C
    Réponses: 3
    Dernier message: 03/04/2006, 17h14
  4. Optimiser traitement fichier [.txt]
    Par Metallic-84s dans le forum Langage
    Réponses: 14
    Dernier message: 16/03/2006, 13h33
  5. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo