2222try :
2323 import igor .binarywave as bw
2424 import igor .packed as pxp
25-
25+ from igor . record . wave import WaveRecord
2626 HAVE_IGOR = True
2727except ImportError :
2828 HAVE_IGOR = False
@@ -73,6 +73,7 @@ def __init__(self, filename=None, parse_notes=None):
7373 self .filename = filename
7474 self .extension = filename .split ('.' )[- 1 ]
7575 self .parse_notes = parse_notes
76+ self ._filesystem = None
7677
7778 def read_block (self , lazy = False ):
7879 assert not lazy , 'Do not support lazy'
@@ -84,11 +85,23 @@ def read_block(self, lazy=False):
8485
8586 def read_segment (self , lazy = False ):
8687 assert not lazy , 'Do not support lazy'
87-
8888 segment = Segment (file_origin = self .filename )
89- segment .analogsignals .append (
90- self .read_analogsignal (lazy = lazy ))
91- segment .analogsignals [- 1 ].segment = segment
89+
90+ if self .extension == 'pxp' :
91+ if not self ._filesystem :
92+ _ , self .filesystem = pxp .load (self .filename )
93+
94+ def callback (dirpath , key , value ):
95+ if isinstance (value , WaveRecord ):
96+ signal = self ._wave_to_analogsignal (value .wave ['wave' ])
97+ signal .segment = segment
98+ segment .analogsignals .append (signal )
99+
100+ pxp .walk (self .filesystem , callback )
101+ else :
102+ segment .analogsignals .append (
103+ self .read_analogsignal (lazy = lazy ))
104+ segment .analogsignals [- 1 ].segment = segment
92105 return segment
93106
94107 def read_analogsignal (self , path = None , lazy = False ):
@@ -106,14 +119,18 @@ def read_analogsignal(self, path=None, lazy=False):
106119 elif self .extension == 'pxp' :
107120 assert type (path ) is str , \
108121 "A colon-separated Igor-style path must be provided."
109- _ , filesystem = pxp .load (self .filename )
110- path = path .split (':' )
111- location = filesystem ['root' ]
112- for element in path :
113- if element != 'root' :
114- location = location [element .encode ('utf8' )]
122+ if not self ._filesystem :
123+ _ , self .filesystem = pxp .load (self .filename )
124+ path = path .split (':' )
125+ location = self .filesystem ['root' ]
126+ for element in path :
127+ if element != 'root' :
128+ location = location [element .encode ('utf8' )]
115129 data = location .wave
116- content = data ['wave' ]
130+
131+ return self ._wave_to_analogsignal (data ['wave' ])
132+
133+ def _wave_to_analogsignal (self , content ):
117134 if "padding" in content :
118135 assert content ['padding' ].size == 0 , \
119136 "Cannot handle non-empty padding"
0 commit comments