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 :

mettre en mémoire au lieu d’écrire dans un fichier tampon ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut mettre en mémoire au lieu d’écrire dans un fichier tampon ?
    Bonjour,

    Je récupère un fichier je le met dans un fichier texte, puis je lis le fichier texte ligne à ligne pour copier ce que je veux dans un autre fichier texte, et en fin je recopie et ordonne les informations dans un dernier fichier texte.
    Que je finis par mettre dans un fichier csv pour pouvoir le traiter plus facilement.

    Alors oui cela fonctionne mais en relisant mon code je me dis que je me suis surement vachement compliqué la tache.

    Je me dis également que créer des fichiers tempo pour a chaque fois le lire, et copier les valeurs est surement gourmand en ressource.

    Y aurait il un moyen de remplacer l'écriture dans un fichier text pour par exemple le mettre dans un fichier virtuel ou un truc du genre qui serait plus rapidement accessible par python que de lire un fichier txt ?

    J'espère avoir été assez clair pour que vous puissiez me donner une piste à creuser.

    Merci d'avance


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fichier_source = open(outputfile, "r")
    fichier_destination = open(outputfile_mod, "w")
     
    for ligne in fichier_source:
        temp = str(ligne).lstrip()
        if temp[:12] == "(0008, 0104)":
            fichier_destination.write(temp)
        elif temp[:12] == "(0008, 0100)":
            fichier_destination.write(temp)
        elif temp[:12] == "(0040, a30a)":
            fichier_destination.write(temp)
     
    fichier_source.close()
    fichier_destination.close()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    fichier_source = open(outputfile_mod, "r")
    fichier_destination = open(outputfile_final, "w")
    lines = fichier_source.readlines()
     
    for i in range(1, len(lines)):
        if lines[i][:12] == "(0040, a30a)":
            # ligne -6 c'est le tagdicom du groupe de la mesure
            tmp = lines[i-6].split("'")
            if tmp[1] == '121410': # code d'une non mesure
                fichier_destination.write(',')
            else:
                fichier_destination.write(tmp[1] + ',')
            # ligne -5 c'est le nom groupe de la mesure
            tmp = lines[i-5].split("'")
            if tmp[1] == 'User chosen value': # valeur text d'une non mesure
                fichier_destination.write(',')
            else:
                fichier_destination.write(tmp[1] + ',')
            # ligne -4 le tag dicom de la mesure
            tmp = lines[i-4].split("'")
            fichier_destination.write(tmp[1] + ',')
            # ligne -3 le nom de la mesure
            tmp = lines[i-3].split("'")
            fichier_destination.write(tmp[1] + ',')
            fichier_destination.write(" ")
            # ligne i la valeur mesurée
            tmp = lines[i].split("'")
            fichier_destination.write(tmp[1] + ',')
            fichier_destination.write(" ")
            # ligne -1 l'unité de mesure
            tmp = lines[i-1].split("'")
            fichier_destination.write(tmp[1])
            fichier_destination.write("\n")
    fichier_destination.close()
    fichier_source.close()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    nom_fichier = nom_fichier + '.csv'
    with open(outputfile_final, 'r') as in_file:
        stripped = (line.strip() for line in in_file)
        lines = (line.split(",") for line in stripped if line)
        with open(nom_fichier, 'w') as out_file:
            writer = csv.writer(out_file)
            writer.writerow(('code DICOM paramère', 'Nom paramètre',
                             'Code DICOM mesure', 'Valeur mesurée',
                             'Mesure', 'Unité mesure'))
            writer.writerows(lines)
     
    # Supprime les fichiers temporaires
    os.remove(outputfile)
    os.remove(outputfile_mod)
    os.remove(outputfile_final)

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par figuedi Voir le message
    ...mais en relisant mon code je me dis que je me suis surement vachement compliqué la tache.
    Je confirme !!!

    Citation Envoyé par figuedi Voir le message
    Je me dis également que créer des fichiers tempo pour a chaque fois le lire, et copier les valeurs est surement gourmand en ressource.
    Et ne parlons pas des collisions (deux utilisateurs utilisant ton programme en même temps)...

    Citation Envoyé par figuedi Voir le message
    Y aurait il un moyen de remplacer l'écriture dans un fichier text pour par exemple le mettre dans un fichier virtuel ou un truc du genre qui serait plus rapidement accessible par python que de lire un fichier txt ?
    Déjà il existe des outils permettant de définir des filesystem en RAM. Sous Linux c'est le type "tmpfs" placé en début de ligne de "/etc/fstab" et sous Windows il y a des outils tels que "ramdisk" et autres. Donc tu écris le fichier sur disque mais en réalité il est en RAM.
    Mais sinon pourquoi ne pas stocker directement tes lignes dans un tableau de lignes ? Comme ça tu as tout en RAM. Tu as la fonction readlines() qui fait ça.
    Donc tu as tes lignes en RAM que tu peux modifier quand et comme tu veux.

    Ou alors tu fais tes 3 étapes sur chaque ligne lue donc durant toute l'exécution tu n'en stockes qu'une seule à la fois et ton programme devient immédiatement plus fluide et plus digeste.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    rien compris à tes 3 étapes, pourquoi ne pas en faire qu'une seule ?
    J'ai pas forcément compris ton problème, c'est juste un code type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    block = []
    with open("entree.txt", "r") as f_in, with open("sortie.csv", "w") as f_out:
        f_out.write("ton, entete, csv")
        for line in f_in:
            if line[:12] not in ("(0008, 0104)", "(0008, 0100)", "(0040, a30a)"):
                # on ne traite que ces 3 cas
                continue 
     
            block.append(line)
     
            # ps: ? si nous avons 6 lignes dans "block" alors nous pouvons les sauver commme une ligne csv ?
            if len(block) == 6:
     
                # tout ton code no 2
                # ligne -6 c'est le tagdicom du groupe de la mesure
     
                for line in block:
                    tableau = line.split("'")
                    if tableau[1] in ('121410', 'User chosen value'):
                        tableau[1] = ""
                    f_out.write(", ".join(tableau))
                ...
                block = []  # on a traité ces 6 lignes, on attend les 6 prochaines

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 739
    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 739
    Par défaut
    Salut,

    Citation Envoyé par figuedi Voir le message
    J'espère avoir été assez clair pour que vous puissiez me donner une piste à creuser.
    C'est vous qui avez choisi ce découpage et de passer par des fichiers texte intermédiaires.
    Mais c'est quoi un fichier texte? Une suite de lignes.
    Ce qui permet d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ligne in fichier_source:
        ...
    où les ... sont les traitements à effectuer pour chaque ligne.
    Et si on doit appliquer d'autres traitements au résultat de ce premier traitement, on préférera stocker ce résultat dans une liste plutôt que dans un fichier, genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    resultat = []
    for ligne in fichier_source:
        u = ligne.lstrip()
        v = u[:12]
        if v ==  "(0008, 0104)" or v == "(0008, 0100)" or v == "(0040, a30a)":
              resultat.append(u)
    Puis vous pourriez avoir la bonne idée de faire de ces lignes une fonction qui prenne une suite lignes en paramètre et qui retourne le résultat (qui est aussi une suite de lignes).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def f(source):
        resultat = []
        for item in source:
            u = item.lstrip()
            v = u[:12]
            if v ==  "(0008, 0104)" or v == "(0008, 0100)" or v == "(0040, a30a)":
                  resultat.append(u)
        return resultat
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut
    En effet c'était très stupide de passer par des fichiers textes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    di = dcmread(path)
    with open(outputfile, 'w') as f:
        f.write(str(di))
     
    # récupére les tag dicom intéressant
    with open(outputfile, "r") as f:
        temporaire = []
        for ligne in f:
            temp = str(ligne).lstrip()
            if (temp[:12] == "(0008, 0104)" or temp[:12] == "(0008, 0100)" or temp[:12] == "(0040, a30a)"): 
                temporaire.append(temp)
    il ne me reste plus qu'a faire pareil pour la seconde partie ordonnancement et export en csv

    MErci

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Et partir directement sur un for ligne in dcmread(path) ça le ferait pas encore mieux ?
    PS: inutile de mettre du str() de partout, surtout quand la data est déjà du str...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut
    si j'enlève le str j'ai une erreur
    Traceback (most recent call last):
    File "f:\0_Code\Dicom_SR_seul_V2.py", line 20, in <module>
    f.write(di)
    TypeError: write() argument must be str, not FileDataset
    du coup j'ai tenté e coup avec le str et ça à marché

    Je vais tenter de le mettre dans une liste comme les autres
    en attendant j'ai fini l'arrangement et la conversion en CSV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    di = dcmread(path)
    with open(outputfile, 'w') as f:
        f.write(di)
     
    # récupére les tag dicom intéressant
    with open(outputfile, "r") as f:
        temporaire = []
        for ligne in f:
            temp = str(ligne).lstrip()
            if (temp[:12] == "(0008, 0104)" or temp[:12] == "(0008, 0100)" or temp[:12] == "(0040, a30a)"): 
                temporaire.append(temp)
     
     
    # ordonne les infos pour être compréhensible facilement
     
    temporaire2 = []
    for i in range(1, len(temporaire)):
        if temporaire[i][:12] == "(0040, a30a)":
            # ligne -6 c'est le tagdicom du groupe de la mesure
            tmp = temporaire[i-6].split("'")
            if tmp[1] == '121410': # code d'une non mesure
                temporaire2.append('')
            else:
                temporaire2.append(tmp[1])
            # ligne -5 c'est le nom groupe de la mesure
            tmp = temporaire[i-5].split("'")
            if tmp[1] == 'User chosen value': # valeur text d'une non mesure
                temporaire2.append('')
            else:
                temporaire2.append(tmp[1])
            # ligne -4 le tag dicom de la mesure
            tmp = temporaire[i-4].split("'")
            temporaire2.append(tmp[1])
            # ligne -3 le nom de la mesure
            tmp = temporaire[i-3].split("'")
            temporaire2.append(tmp[1])
            # ligne i la valeur mesurée
            tmp = temporaire[i].split("'")
            temporaire2.append(tmp[1])
            # ligne -1 l'unité de mesure
            tmp = temporaire[i-1].split("'")
            if tmp[1] == 'no units':
                temporaire2.append('')
            else:
                temporaire2.append(tmp[1])
     
    # transforme le dernier fichier txt en un CSV pour une meilleur compréhension
    nom_fichier = nom_fichier + '.csv'
     
    with open(nom_fichier, 'w') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('code DICOM paramère', 'Nom paramètre',
                         'Code DICOM mesure', 'Valeur mesurée',
                         'Mesure', 'Unité mesure'))
        for i in range(0, len(temporaire2), 6):
            writer.writerow((temporaire2[i],
                            temporaire2[i+1],
                            temporaire2[i+2],
                            temporaire2[i+3],
                            temporaire2[i+4],
                            temporaire2[i+5]))

  8. #8
    Membre confirmé
    Homme Profil pro
    support technique
    Inscrit en
    Mars 2020
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : support technique

    Informations forums :
    Inscription : Mars 2020
    Messages : 79
    Par défaut
    Ok un dataset est un groupe de données liées à une clef.

    J'ai donc trouvé la clef qu'il me fallait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    di = dcmread(path)
    elem = di[(0x0040, 0xa730)]
    with open('didier.txt', 'w') as f:
        f.write(str(elem))
    #with open('didierkeys.txt','w') as fk:
    #    fk.write(str(di.keys()))
    je peux donc partir de là pour éviter du post traitement superflu

    bon toujours obligé de le "flaguer" en str
    File "f:\0_Code\Dicom_SR_seul_V2.py", line 20, in <module>
    f.write(elem)
    TypeError: write() argument must be str, not DataElement
    mais ça avance petit à petit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 18
    Dernier message: 06/02/2008, 11h51
  2. Réponses: 8
    Dernier message: 13/04/2007, 11h17
  3. [SQL] Comment je peux mettre les résultat d'une requete dans un fichier
    Par Maria1505 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 10/12/2006, 21h44
  4. Réponses: 2
    Dernier message: 08/06/2006, 13h48
  5. Mettre les valeurs d'un tableau dans un fichier
    Par ero-sennin dans le forum C++
    Réponses: 4
    Dernier message: 14/03/2006, 13h47

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