Problème lecture details

Fermé
heh - 28 mai 2021 à 12:11
 heh - 1 juin 2021 à 08:50
Bonjour,
Je suis en train de programmer l'automatisation d'un oscilloscope.
Et pour faire simple il y a plusieurs paramétrages et j'aimerais que quand j'ouvre le fichier que je puisse lire chacun d'entre eux un a un pour y attribuer une fonction. Le problème c'est que je ne sais pas trop comment m'y prendre.

Voici le fichier à lire:
:HEADER 0;:VERBOSE 1;:DATA:ENCDG SRIBINARY;DESTINATION REFA;SOURCE CH1;START 1;STOP 2500;WIDTH 1;:LOCK NONE;:DISPLAY:FORMAT YT;STYLE VECTORS;PERSISTENCE 0;CONTRAST 63;INVERT OFF;:ACQUIRE:MODE SAMPLE;NUMAVG 16;STATE 1;STOPAFTER RUNSTOP;:CH1:PROBE 1.0E1;CURRENTPROBE 1.0E2;SCALE 5.0E0;POSITION 0.0E0;COUPLING DC;BANDWIDTH OFF;INVERT OFF;YUNIT "A";:CH2:PROBE 1.0E3;CURRENTPROBE 1.0E3;SCALE 5.0E1;POSITION 0.0E0;COUPLING DC;BANDWIDTH OFF;INVERT OFF;YUNIT "V";:CH3:PROBE 1.0E1;CURRENTPROBE 1.0E1;SCALE 5.0E-1;POSITION 0.0E0;COUPLING DC;BANDWIDTH OFF;INVERT OFF;YUNIT "V";:CH4:PROBE 1.0E1;CURRENTPROBE 1.0E1;SCALE 5.0E-1;POSITION 0.0E0;COUPLING DC;BANDWIDTH OFF;INVERT OFF;YUNIT "V";:HORIZONTAL:VIEW MAIN;MAIN:SCALE 5.0E-4;POSITION 0.0E0;:HORIZONTAL:DELAY:SCALE 2.5E-9;POSITION 0.0E0;:TRIGGER:MAIN:MODE AUTO;TYPE EDGE;HOLDOFF:VALUE 5.0E-7;:TRIGGER:MAIN:EDGE:SOURCE CH1;COUPLING DC;SLOPE RISE;:TRIGGER:MAIN:VIDEO:SOURCE CH1;SYNC FIELD;POLARITY NORMAL;LINE 1;STANDARD NTSC;:TRIGGER:MAIN:PULSE:SOURCE CH1;WIDTH:POLARITY POSITIVE;WHEN EQUAL;WIDTH 1.0E-3;:TRIGGER:MAIN:LEVEL 0.0E0;:SELECT:CH1 1;CH2 0;CH3 0;CH4 0;MATH 0;REFA 0;REFB 0;REFC 0;REFD 0;:CURSOR:FUNCTION OFF;SELECT:SOURCE MATH;:CURSOR:VBARS:UNITS SECONDS;POSITION1 -2.5E-3;POSITION2 2.5E-3;:CURSOR:HBARS:POSITION1 1.70103001E1;POSITION2 -1.45896999E1;:DATALOGGING:DURATION 30;SOURCE CH1;:MEASUREMENT:MEAS1:TYPE MEAN;SOURCE CH1;:MEASUREMENT:MEAS2:TYPE MINIMUM;SOURCE CH1;:MEASUREMENT:MEAS3:TYPE MAXIMUM;SOURCE CH1;:MEASUREMENT:MEAS4:TYPE FREQUENCY;SOURCE CH1;:MEASUREMENT:MEAS5:TYPE PERIOD;SOURCE CH1;:MEASUREMENT:IMMED:TYPE PERIOD;SOURCE1 CH1;:MEASUREMENT:METHOD AUTO;:MATH:DEFINE "FFT(CH1,FLATTOP)";VERTICAL:POSITION 0.0E0;SCALE 1.0E4;:MATH:FFT:HORIZONTAL:POSITION 5.0E1;SCALE 1.0E0;:MATH:FFT:VERTICAL:POSITION 0.0E0;SCALE 1.0E0;:HARDCOPY:BUTTON SAVESIMAGE;FORMAT JPEG;PORT USB;LAYOUT PORTRAIT;INKSAVER ON;:PICTBRIDGE:PAPERSIZE DEFLT;IMAGESIZE DEFLT;PAPERTYPE DEFLT;PRINTQUAL DEFLT;DATEPRINT DEFLT;IDPRINT DEFLT;:LANGUAGE FRENCH;:AUTORANGE:SETTINGS BOTH;:LIMIT:SOURCE CH1;COMPARE REFA;SAVEIMAGE 0;SAVEWFM 0;STOPAFTER:MODE MANUAL;:LIMIT:TEMPLATE:DESTINATION REFA;SOURCE CH1;TOLERANCE:HORIZONTAL 0;VERTICAL 0;:SAVE:IMAGE:FILEFORMAT JPEG

J'avais trouver une solution qui correspondait pour par exemple les lignes de measurement ":MEASUREMENT:MEAS1:TYPE MEAN"
voici le morceau de code y correspondant:

print(f)
data=f.readlines()
print(data)
print(data[0])
listedata=data[0].split(';') #coupe la grande chaine en plusieurs éléments séparés par ';'
for l in listedata:
ll=l.split(' ') #coupe chaque petite chaine en plusieurs éléments séparés par ' '
#print(ll[0])
if ll[0]==":MEASUREMENT:MEAS1:TYPE":
print("TROUVE: "+ ll[1])
if ll[1]=="MEAN":
print("il faut faire le réglage MEAN")


Mais pour les sous menu par exemple je ne comprends pas trop comment je peux faire.

Dites moi si le message n'est pas claire. Merci à vous pour votre aide

Configuration: Windows / Edge 90.0.818.66
A voir également:

7 réponses

jee pee Messages postés 39646 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
Modifié le 31 mai 2021 à 11:22
Bonjour,

A l'examen d'une liste des lignes sur séparateur ";" on peut supposer qu'une ligne qui ne commence pas par ":" est une ligne détail (ton sous-menu) liée à la ligne ":" précédente.

En partant de ce principe, voici un affichage liste avec décalage, une nouvelle liste avec rajout de la clé, une fonction affichage liste sur une clé, et une fonction recherche valeur d'une clé

with open('oscillo.txt') as f:
    data = f.read()
    lines = data.split(';')
    lastKey=''
    for line in lines: # liste des lignes avec décalage clé
        if line[0] == ':':
            lastKey = line[:line.rfind(':')+1]
        else:
            print(' '*(len(lastKey)),end='')
        print(line)

    print()
    lastKey=''
    nlines=[]
    for line in lines: # nouvelle liste avec intégration clé
        if line[0] == ':':
            lastKey = line[:line.rfind(':')+1]
            nlines.append(line)
        else:
            nlines.append(lastKey+line)
            
    for line in nlines:
        print(line)

    def rechKey (key): # affichage lignes suivant la clé donnée
        for line in nlines:
             if line.startswith(key):
                  print(line)

    def rechValue (key): # recherche valeur sur clé détail
        for line in nlines:
             if line.startswith(key):
                  return line[len(key)+1:]
    print()
    rechKey(':MEASUREMENT:MEAS1')
    rechKey(':MEASUREMENT:MEAS1:TYPE')
    print()
    print(rechValue(':MEASUREMENT:MEAS1:TYPE'))
    print(rechValue(':MEASUREMENT:MEAS1:SOURCE'))
    print(rechValue(':MEASUREMENT:MEAS1:XXX'))  


1
Bonjour.

Ce n'est pas clair non, sous-menu de quoi ?
Ton fichier est un csv ?
0
Le fichier texte que j'ai recopier au dessus est le contenu d'un fichier texte et ne peux pas être changer c'est un fichier qui se génère automatiquement de l'oscilloscope.

En fait, c'est une copie de la configuration complète. Ce que je dois faire c'est crée un script python qui va lire ce fichier, lire tout les paramètre et apres moi plus tard je devrais y associé une action.
Par exemple la ligne measurement meas1 que j'ai mise nous indique qu'il s'agit d'une mesure de moyenne.

f = open('TEST2.txt')
#http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html

print(f)
data=f.readlines()
print(data)
print(data[0])
listedata=data[0].split(';') #coupe la grande chaine en plusieurs éléments séparés par ';'
for l in listedata:
ll=l.split(' ') #coupe chaque petite chaine en plusieurs éléments séparés par ' '
#print(ll[0])
if ll[0]==":MEASUREMENT:MEAS1:TYPE":
print("TROUVE: "+ ll[1])
if ll[1]=="MEAN":
print("il faut faire le réglage MEAN")
f.close()


Toutes les configuration sont séparé par des ";" mais pas celles avec des sous menu comme je l'ai dis pour ":DATA:ENCDG SRIBINARY;DESTINATION REFA;SOURCE CH1;START 1;STOP 2500;WIDTH 1;" il y a 6 sous menus ENCDG DESTINATION SOURCE START STOP et WIDTH. Tous les 6 vont de paire avec DATA mais il n'est recopier que pour le premier sous menu.

Et je ne sais pas comment rédiger cette particularite. Le code que j'avais transmis au dessus fonctionne pour mesurements mais pas pour data et d'autres. Je ne sais pas si c'est plus claire comme ça.
0
Il est quand même bizarre ton fichier, Ce n'est pas plutôt que chaque ligne de valeurs est séparée par : et non le ; ?
Car je ne vois pas comment le lire en séparant les valeurs correctement sans se torturer doigts et cerveau...

Un truc comme ça :

with open('le_fichier_a_lire') as f:
    data = f.read()
    lines = data.split(':')
    print('\n'.join(lines))


Serait à mon sens plus facilement interprétable.
0

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

Posez votre question
yg_be Messages postés 22728 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
28 mai 2021 à 18:53
bonjour,
tu nous montres le fichier à traiter et un programme qui ne fait pas ce que tu attends.
montres-nous plutôt le résultat attendu pour le fichier à traiter.
0
yg_be Messages postés 22728 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
28 mai 2021 à 18:56
je pense que ton fichier est facile à analyser, mais je ne comprends pas ce que doit réaliser le programme.
0
En fait, le fichier que j'ai envoyer représentre les parametrages d'un oscilloscope. Par exemple si on prend ":HEADER 0;:VERBOSE 1;:DATA:ENCDG SRIBINARY;DESTINATION REFA;SOURCE CH1;START 1;STOP 2500;WIDTH 1;" cela veut dire que le hearder est a 0 verbose a 1 que le DATA:ENCDG est en SRIBINARY que DATA:DESTINATION est en REFA, que DATA:SOURCE c'est CH1 que DATA:STAR est à 1 etc... Et tout le reste rédiger de la même facon. Et ce que je cherche à faire est de lire la réponse pour chacun des paramétrage. Comme je l'ai dis précédemment, pour ":MEASUREMENT:MEAS1:TYPE MEAN" je peux utiliser le code que j'ai poster au dessus mais je ne sais pas comment procéder avec les fonction comme pour le DATA: ou il n'est pas répéter à chaque fois est n'est pas entre ":".
0
Merci à tous pour vous messages.

J'ai réussi à coder ce que je voulais faire, je vous partage mon code pour que vous puissiez comprendre ce que j'attendais. Mais maintenant j'ai un autre pb:

import pyvisa
import time
rm = pyvisa.ResourceManager()
rm.list_resources()

scope = rm.open_resource('USB0::0x0699::0x03A4::C040158::INSTR')

print(scope.query('*IDN?'))

scope.timeout = 100000
scope.read_termination = '\n'
scope.write_termination = '\n'

f = open('C:\\Users\\stagiaire\\Desktop\\Stage_El_harrani\\oscilloscope\\script python py\\comparaison.SET')
dataList = f.readlines()[0].split(';');
structure = ""; # ça va être le chemin pour accéder a ta variable dans l'exemple CURSOR:HBARS avec la variable en plus
for i,d in enumerate(dataList):
  splitedData = d.split(' ');
  if(":" in splitedData[0]):
    structure = splitedData[0]; # là t'as la bonne structure avec la variable
    print(structure + " -> " + splitedData[1]);
    scope.write(structure + " " + splitedData[1]);
  else:
    index = i - 1;
    nameFound = False;
    while nameFound == False:
      if(":" in dataList[index]): # on remonte dans le tableau pour retrouver la structure
        tempStructure = dataList[index];
        path = tempStructure.split(" ")[0].split(":")[:-1]; # ici on split les labels et on enlève le dernier nom pour ne pas avoir la variable dans la structure 
        structure = ':'.join(path) + ":" + splitedData[0]; # là on fusionne le chemin et on ajoute le nom de la variable
        nameFound = True;
        print(structure + " -> " + splitedData[1]);
        scope.write(structure + " " + splitedData[1]);
      index = index - 1;


Ce code fonctionne pour le fichier texte que je vous ai transmit au dessus, où tous les paramettres sont collés. Or maintenant je dois travailler sur des fichier .SET et à l'interrieur chaque catégorie est séparé par un saut de ligne et mon code ne les prends pas en compte avez vous une solution.
Je vous poste le contenu du fichier .SET ci dessous.
:HEADER 0;
:VERBOSE 1;
:DATA:ENCDG SRIBINARY;DESTINATION REFA;SOURCE CH1;START 1;STOP 2500;WIDTH 1;
:LOCK NONE;
:DISPLAY:FORMAT YT;STYLE VECTORS;PERSISTENCE 0;CONTRAST 63;INVERT OFF;
:ACQUIRE:MODE SAMPLE;NUMAVG 16;STATE 1;STOPAFTER RUNSTOP;
:CH1:PROBE 1.0E1;CURRENTPROBE 1.0E2;SCALE 5.0E1;POSITION 0.0E0;COUPLING DC;BANDWIDTH OFF;INVERT OFF;YUNIT "A";
:CH2:PROBE 1.0E3;CURRENTPROBE 1.0E3;SCALE 5.0E1;POSITION 0.0E0;COUPLING DC;BANDWIDTH OFF;INVERT OFF;YUNIT "V";
:CH3:PROBE 1.0E1;CURRENTPROBE 1.0E1;SCALE 5.0E-1;POSITION 0.0E0;COUPLING DC;BANDWIDTH OFF;INVERT OFF;YUNIT "V";
:CH4:PROBE 1.0E1;CURRENTPROBE 1.0E1;SCALE 5.0E-1;POSITION 0.0E0;COUPLING DC;BANDWIDTH OFF;INVERT OFF;YUNIT "V";
:HORIZONTAL:VIEW MAIN;MAIN:SCALE 5.0E-4;POSITION 0.0E0;
:HORIZONTAL:DELAY:SCALE 2.5E-9;POSITION 0.0E0;
:TRIGGER:MAIN:MODE AUTO;TYPE EDGE;HOLDOFF:VALUE 5.0E-7;
:TRIGGER:MAIN:EDGE:SOURCE CH1;COUPLING DC;SLOPE RISE;
:TRIGGER:MAIN:VIDEO:SOURCE CH1;SYNC FIELD;POLARITY NORMAL;LINE 1;STANDARD NTSC;
:TRIGGER:MAIN:PULSE:SOURCE CH1;WIDTH:POLARITY POSITIVE;WHEN EQUAL;WIDTH 1.0E-3;
:TRIGGER:MAIN:LEVEL 0.0E0;
:SELECT:CH1 1;CH2 0;CH3 0;CH4 0;MATH 0;REFA 0;REFB 0;REFC 0;REFD 0;
:CURSOR:FUNCTION OFF;SELECT:SOURCE CH1;
:CURSOR:VBARS:UNITS SECONDS;POSITION1 -2.5E-3;POSITION2 2.5E-3;
:CURSOR:HBARS:POSITION1 1.8E1;POSITION2 -1.4E1;
:DATALOGGING:DURATION 30;SOURCE CH1;
:MEASUREMENT:MEAS1:TYPE MEAN;SOURCE CH1;
:MEASUREMENT:MEAS2:TYPE MINIMUM;SOURCE CH1;
:MEASUREMENT:MEAS3:TYPE MAXIMUM;SOURCE CH1;
:MEASUREMENT:MEAS4:TYPE FREQUENCY;SOURCE CH1;
:MEASUREMENT:MEAS5:TYPE PERIOD;SOURCE CH1;
:MEASUREMENT:IMMED:TYPE PERIOD;SOURCE1 CH1;
:MEASUREMENT:METHOD AUTO;
:MATH:DEFINE "FFT(CH1,FLATTOP)";VERTICAL:POSITION 0.0E0;SCALE 1.0E2;
:MATH:FFT:HORIZONTAL:POSITION 5.0E1;SCALE 1.0E0;
:MATH:FFT:VERTICAL:POSITION 0.0E0;SCALE 1.0E0;
:HARDCOPY:BUTTON SAVESIMAGE;FORMAT JPEG;PORT USB;LAYOUT PORTRAIT;INKSAVER ON;
:PICTBRIDGE:PAPERSIZE DEFLT;IMAGESIZE DEFLT;PAPERTYPE DEFLT;PRINTQUAL DEFLT;DATEPRINT DEFLT;IDPRINT DEFLT;
:LANGUAGE FRENCH;
:AUTORANGE:SETTINGS BOTH;
:LIMIT:SOURCE CH1;COMPARE REFA;SAVEIMAGE 0;SAVEWFM 0;STOPAFTER:MODE MANUAL;
:LIMIT:TEMPLATE:DESTINATION REFA;SOURCE CH1;TOLERANCE:HORIZONTAL 0;VERTICAL 0;
:SAVE:IMAGE:FILEFORMAT JPEG
Merci à vous pour toute votre aide
0