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

  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 860
    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 860
    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 325
    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 325
    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 790
    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 790
    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 860
    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 860
    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

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 860
    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 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par figuedi Voir le message
    bon toujours obligé de le "flaguer" en str
    Ok pour FileDataSet puisque manifestement la conversion n'est pas automatique.
    Mais pas pour le for ligne in f de ton post d'hier soir.
    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]

  10. #10
    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
    ah oui mince,
    merci

  11. #11
    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
    Bon j'ai réussi à tout mettre dans une seule boucle, enfin deux vu qu'il y a une pour la mise en forme en csv.

    Reste plus qu'à voir pour partir directement avec la dataset qui va bien


    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
    62
    63
    64
    65
    66
    67
    68
    from pydicom import dcmread
    from tkinter import filedialog
    import csv
    import os
     
    path = filedialog.askopenfilename(initialdir="c:\\",
                                      title="Select a File")
    path1 = path.split('/')
    nom_fichier = path1[len(path1)-1]
    outputfile = ('temp.txt')
     
    # utilise la lib pydicom pour lire et enregistrer le dcm dans un fichier txt
    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 = []
        temp = []
        i = 0
        for ligne in f:
            ligne = ligne.lstrip()
            if (ligne[:12] == "(0008, 0104)" or ligne[:12] == "(0008, 0100)"
               or ligne[:12] == "(0040, a30a)"):
                ligne_splited = ligne.split("'")
                temp.append(ligne_splited[1])
                if ligne[:12] == "(0040, a30a)":
                    # tagdicom du groupe de la mesure             
                    if temp[i-6] == '121410':
                        temporaire.append('')
                    else:
                        temporaire.append(temp[i-6])
                    # nom groupe de la mesure
                    if temp[i-5] == 'User chosen value':
                        temporaire.append('')
                    else:
                        temporaire.append(temp[i-5])
                    # tag dicom de la mesure
                    temporaire.append(temp[i-4])
                    # nom de la mesure
                    temporaire.append(temp[i-3])
                    # valeur mesurée
                    temporaire.append(temp[i])
                    # unité de mesure
                    if temp[i-1] == 'no units':
                        temporaire.append('')
                    else:
                        temporaire.append(temp[i-1])
                i += 1
     
    # transforme en un CSV
    nom_fichier = nom_fichier + '.csv'
     
    with open(nom_fichier, 'w') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('code DICOM paramètre', 'Nom paramètre',
                         'Code DICOM mesure', 'Valeur mesurée',
                         'Mesure', 'Unité mesure'))
        for i in range(0, len(temporaire), 6):
            writer.writerow((temporaire[i],
                            temporaire[i+1],
                            temporaire[i+2],
                            temporaire[i+3],
                            temporaire[i+4],
                            temporaire[i+5]))
     
    os.remove(outputfile)

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 860
    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 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par figuedi Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    path = filedialog.askopenfilename(initialdir="c:\\",
                                      title="Select a File")
    path1 = path.split('/')
    nom_fichier = path1[len(path1)-1]
    outputfile = ('temp.txt')
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    nom_fichier=filedialog.askopenfilename(initialdir="c:\\",
                                      title="Select a File").split("/")[-1]
     
    import pathlib
    nom_fichier=pathlib.Path(filedialog.askopenfilename(initialdir="c:\\",
                                      title="Select a File")).name

    Et sinon tu en as vraiment besoin de ce outputfile que tu écris juste pour venir le relire derrière ? Et des parenthèses autour du nom ?
    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]

  13. #13
    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
    merci pour pathlib
    et v'la le code sans le fichier tempo
    oui encore un str() mais pareil il me retourne une erreur si je ne le met pas
    en tout cas merci je suis déjà passé de 85 lignes à 60. une bonne cure d'amaigrissement
    et sans les fichiers text temporaires ça va plus vite aussi, quand je devrais l'automatiser sur un dossier et plus un simple fichier cela fera du bien pour sûr

    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
    from pydicom import dcmread
    from tkinter import filedialog
    import csv
    from pathlib import Path
    path = Path(filedialog.askopenfilename(initialdir="c:\\",
                                           title="Select a File"))
    new_path = path.with_suffix('.csv')
     
    # utilise la lib pydicom pour lire et enregistrer le dcm dans un fichier txt
    di = dcmread(path)
    # récupère une suite de ligne
    fv = str(di).split('\n')
    # récupére les tag dicom intéressant
    temporaire = []
    temp = []
    i = 0
    for ligne in fv:
        # for ligne in f:
        ligne = ligne.lstrip()
        if (ligne[:12] == "(0008, 0104)" or ligne[:12] == "(0008, 0100)"
           or ligne[:12] == "(0040, a30a)"):
            ligne_splited = ligne.split("'")
            temp.append(ligne_splited[1])
            if ligne[:12] == "(0040, a30a)":
                # tagdicom du groupe de la mesure             
                if temp[i-6] == '121410':
                    temporaire.append('')
                else:
                    temporaire.append(temp[i-6])
                # nom groupe de la mesure
                if temp[i-5] == 'User chosen value':
                    temporaire.append('')
                else:
                    temporaire.append(temp[i-5])
                # tag dicom de la mesure
                temporaire.append(temp[i-4])
                # nom de la mesure
                temporaire.append(temp[i-3])
                # valeur mesurée
                temporaire.append(temp[i])
                # unité de mesure
                if temp[i-1] == 'no units':
                    temporaire.append('')
                else:
                    temporaire.append(temp[i-1])
            i += 1
     
    # transforme en un CSV
    with open(new_path, 'w', newline='') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('code DICOM paramètre', 'Nom paramètre',
                         'Code DICOM mesure', 'Valeur mesurée',
                         'Mesure', 'Unité mesure'))
        for i in range(0, len(temporaire), 6):
            writer.writerow((temporaire[i],
                            temporaire[i+1],
                            temporaire[i+2],
                            temporaire[i+3],
                            temporaire[i+4],
                            temporaire[i+5]))
    Il ne me reste plus qu'à me creuser la tête pour voir si je peux réunir les deux boucles en une on ne sait jamais

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 860
    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 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par figuedi Voir le message
    en tout cas merci je suis déjà passé de 85 lignes à 60. une bonne cure d'amaigrissement
    C'est pas toujours un but en soi (tronquer pour tronquer peut amener ensuite des difficultés de lisibilité).
    Mais peut-être voir si...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ligne in fv:
    	ligne = ligne.lstrip()
    ... peut devenir for ligne in map(str.lstrip, fv) sans gêner la relecture.

    Ensuite toutes ces instructions du type
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if truc:
    	var=valeurA
    else:
    	var=valeurB
    peuvent s'écrire var=valeurA if truc else valeurB.
    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]

  15. #15
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je pense que tu dois pouvoir remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (ligne[:12] == "(0008, 0104)" or ligne[:12] == "(0008, 0100)"   \
       or ligne[:12] == "(0040, a30a)"):
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ligne[:12] in ["(0008, 0104)", "(0008, 0100)", "(0040, a30a)"]:
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    writer.writerow((temporaire[i],
                     temporaire[i+1],
                     temporaire[i+2],
                     temporaire[i+3],
                     temporaire[i+4],
                     temporaire[i+5]))
    par un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer.writerow((*temporaire[i:i+6]))
    mes 2 cts,

  16. #16
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 325
    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 325
    Par défaut
    J'avais proposé un type de solution avec une seule boule (sans fichier exemple, je ne suis pas sûr de ton besoin et donc encore moins de mon algo! mais sûr de la structure)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i = 0
    for ligne in fv:
            ...
            i += 1
    en python classique, c'est simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i, ligne in enumerate(fv):
    Pour la (seconde) boucle, j'avais écrit (ne doit pas fonctionner tel quel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for line in block:
                    tableau = line.split("'")
                    if tableau[1] in ('121410', 'User chosen value', 'no units'):
                        tableau[1] = ""
                    f_out.write(", ".join(tableau))
    je pense que tu peux faire une chose de ce type : vider la "cellule" puis utiliser join()

  17. #17
    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
    ouahahahaah,
    je viens de survoler vos réponses bien trop rapidement, mais je vais m'y pencher promis juré craché

    Là il fonctionne avec une seule boucle, et tout en mémoire si je puis dire (en tout cas sans fichier temporaire écrit en dur sur le disque).

    je reviens après avoir lu vos posts
    Merci encore en tout cas

    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
    from pydicom import dcmread
    from tkinter import filedialog
    import csv
    from pathlib import Path
    path = Path(filedialog.askopenfilename(initialdir="c:\\",
                                           title="Select a File"))
    new_path = path.with_suffix('.csv')
     
    # utilise la lib pydicom pour lire et enregistrer le dcm dans un fichier txt
    di = dcmread(path)
    # récupère une suite de ligne
    fv = str(di).split('\n')
    # récupére les tag dicom intéressant
    tp = []
    temp = []
    i = 0
    with open(new_path, 'w', newline='') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('code DICOM paramètre', 'Nom paramètre',
                         'Code DICOM mesure', 'Valeur mesurée',
                         'Mesure', 'Unité mesure'))
        for ligne in map(str.lstrip, fv):
            if (ligne[:12] == "(0008, 0104)" or ligne[:12] == "(0008, 0100)"
                or ligne[:12] == "(0040, a30a)"):
                ligne_splited = ligne.split("'")
                temp.append(ligne_splited[1])
                if ligne[:12] == "(0040, a30a)":
                    tp.append('') if temp[i-6] == '121410'else tp.append(temp[i-6])
                    tp.append('') if temp[i-5] == 'User chosen value' else tp.append(temp[i-5])
                    tp.append(temp[i-4]), tp.append(temp[i-3]), tp.append(temp[i])
                    tp.append('') if temp[i-1] == 'no units' else tp.append(temp[i-1])
                    writer.writerow((tp[len(tp)-6], tp[len(tp)-5], tp[len(tp)-4],
                                    tp[len(tp)-3], tp[len(tp)-2], tp[len(tp)-1]))
                i += 1

  18. #18
    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
    Oui Papajocker c'est bien la solution que tu avais proposé, sauf que je n'y avais rien compris.
    Alors que maintenant que j'ai suffisamment réfléchi sur le code je m’aperçois que je comprends ce que tu voulais me dire.

    wiztricks : ben en fait j'ai suivi ce que tu préconisais si ce n'est d'avoir la bonne idée de faire une fonction pour y passer les lignes et qu'il me les retourne traitées. Je n'ai aps encore la bonne idée, mais je ne désespère pas pour autant.

    bufferbob : autant ta première astuce (qui était déjà dans les exemples des autres) pas de soucis pour l'utiliser (et la comprendre)

    autant là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer.writerow((*temporaire[i:i+6]))
    faut que je creuse un peu

    mon code en étant là : je me dis que par rapport au premier jet (qui fonctionnait par ailleurs) vous m'avez tous bien aidé.

    Merci donc encore une fois

    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
    with open(new_path, 'w', newline='') as out_file:
        writer = csv.writer(out_file)
        writer.writerow(('code DICOM paramètre', 'Nom paramètre',
                         'Code DICOM mesure', 'Valeur mesurée',
                         'Mesure', 'Unité mesure'))
        for ligne in map(str.lstrip, fv):
            if ligne[:12] in ["(0008, 0104)", "(0008, 0100)", "(0040, a30a)"]:
                temp.append(ligne.split("'")[1])
                if ligne[:12] == "(0040, a30a)":
                    tp.append('') if temp[i-6] == '121410'else tp.append(temp[i-6])
                    tp.append('') if temp[i-5] == 'User chosen value' else tp.append(temp[i-5])
                    tp.append(temp[i-4]), tp.append(temp[i-3]), tp.append(temp[i])
                    tp.append('') if temp[i-1] == 'no units' else tp.append(temp[i-1])
                    writer.writerow((tp[len(tp)-6], tp[len(tp)-5], tp[len(tp)-4],
                                    tp[len(tp)-3], tp[len(tp)-2], tp[len(tp)-1]))
                i += 1

  19. #19
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 860
    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 860
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    i = 0
    for ligne in fv:
            ...
            i += 1
    en python classique, c'est simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i, ligne in enumerate(fv):
    J'y avais pensé aussi mais je crois que le i+=1 ne se fait que sous certaines conditions.

    @figuedi: pour plus de lisibilité concernant les visions des structures de travail je mets l'instruction de début en fin de structure en commentaire
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def fct():
    	for ...
    		if ...
    			while ...
    				...
    				...
    			# while
    		else
    			...
    		# if
    	# for
    # fct()
    .
    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]

  20. #20
    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
    File "f:\0_Code\Dicom_SR_seul_V6.py", line 31
    writer.writerow((*tp[j:j+6]))
    ^^^^^^^^^^
    SyntaxError: cannot use starred expression here
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    j = len(tp)-6
                    writer.writerow((*tp[j:j+6]))
    là ça fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer.writerow((tp[j], tp[j+1], tp[j+2], tp[j+3], tp[j+4], tp[j+5]))
    pas sûr que je puisse simplifier

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

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