~ubuntu-branches/ubuntu/natty/pytables/natty-updates

« back to all changes in this revision

Viewing changes to doc/html/x5755.html

  • Committer: Bazaar Package Importer
  • Author(s): Alexandre Fayolle
  • Date: 2006-06-28 10:45:03 UTC
  • mfrom: (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20060628104503-cc251q5o5j3e2k10
  * Fixed call to pyversions in debian/rules which failed on recent versions 
    of pyversions
  * Fixed clean rule in debian/rules which left the stamp files behind
  * Acknowledge NMU
  * Added Alexandre Fayolle to uploaders

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
 
2
<HTML
 
3
><HEAD
 
4
><TITLE
 
5
>FileNode - simulating
 
6
            files inside PyTables</TITLE
 
7
><META
 
8
NAME="GENERATOR"
 
9
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
 
10
REL="HOME"
 
11
TITLE="PyTables User's Guide"
 
12
HREF="index.html"><LINK
 
13
REL="UP"
 
14
TITLE="FileNode - simulating a filesystem with PyTables"
 
15
HREF="c5708.html"><LINK
 
16
REL="PREVIOUS"
 
17
TITLE="Finding a FileNode
 
18
            node"
 
19
HREF="x5744.html"><LINK
 
20
REL="NEXT"
 
21
TITLE="Complementary notes"
 
22
HREF="x5875.html"></HEAD
 
23
><BODY
 
24
CLASS="sect1"
 
25
BGCOLOR="#FFFFFF"
 
26
TEXT="#000000"
 
27
LINK="#0000FF"
 
28
VLINK="#840084"
 
29
ALINK="#0000FF"
 
30
><DIV
 
31
CLASS="NAVHEADER"
 
32
><TABLE
 
33
SUMMARY="Header navigation table"
 
34
WIDTH="100%"
 
35
BORDER="0"
 
36
CELLPADDING="0"
 
37
CELLSPACING="0"
 
38
><TR
 
39
><TH
 
40
COLSPAN="3"
 
41
ALIGN="center"
 
42
><SPAN
 
43
CLASS="markup"
 
44
>PyTables</SPAN
 
45
> User's Guide: Hierarchical datasets in Python - Release 1.3.2</TH
 
46
></TR
 
47
><TR
 
48
><TD
 
49
WIDTH="10%"
 
50
ALIGN="left"
 
51
VALIGN="bottom"
 
52
><A
 
53
HREF="x5744.html"
 
54
ACCESSKEY="P"
 
55
>Prev</A
 
56
></TD
 
57
><TD
 
58
WIDTH="80%"
 
59
ALIGN="center"
 
60
VALIGN="bottom"
 
61
>Chapter 6. FileNode - simulating a filesystem with <SPAN
 
62
CLASS="markup"
 
63
>PyTables</SPAN
 
64
></TD
 
65
><TD
 
66
WIDTH="10%"
 
67
ALIGN="right"
 
68
VALIGN="bottom"
 
69
><A
 
70
HREF="x5875.html"
 
71
ACCESSKEY="N"
 
72
>Next</A
 
73
></TD
 
74
></TR
 
75
></TABLE
 
76
><HR
 
77
ALIGN="LEFT"
 
78
WIDTH="100%"></DIV
 
79
><DIV
 
80
CLASS="sect1"
 
81
><H1
 
82
CLASS="sect1"
 
83
><A
 
84
NAME="section6.3"
 
85
>6.3. <SPAN
 
86
CLASS="markup"
 
87
>FileNode</SPAN
 
88
> - simulating
 
89
            files inside <SPAN
 
90
CLASS="markup"
 
91
>PyTables</SPAN
 
92
></A
 
93
></H1
 
94
><P
 
95
>The <SPAN
 
96
CLASS="markup"
 
97
>FileNode</SPAN
 
98
> module is part of
 
99
            the <SAMP
 
100
CLASS="computeroutput"
 
101
>nodes</SAMP
 
102
> sub-package of <SAMP
 
103
CLASS="computeroutput"
 
104
>PyTables</SAMP
 
105
>.
 
106
            The recommended way to import the module is:
 
107
          </P
 
108
><PRE
 
109
CLASS="screen"
 
110
>&#13;      &#62;&#62;&#62; from tables.nodes import FileNode
 
111
          </PRE
 
112
><P
 
113
>However, <SPAN
 
114
CLASS="markup"
 
115
>FileNode</SPAN
 
116
> exports very
 
117
            few symbols, so you can import <SAMP
 
118
CLASS="computeroutput"
 
119
>*</SAMP
 
120
> for
 
121
            interactive usage.  In fact, you will most probably only use
 
122
            the <SAMP
 
123
CLASS="computeroutput"
 
124
>NodeType</SAMP
 
125
> constant and the
 
126
            <SAMP
 
127
CLASS="computeroutput"
 
128
>newNode()</SAMP
 
129
> and <SAMP
 
130
CLASS="computeroutput"
 
131
>openNode()</SAMP
 
132
> calls.
 
133
          </P
 
134
><P
 
135
>The <SAMP
 
136
CLASS="computeroutput"
 
137
>NodeType</SAMP
 
138
> constant contains the value that
 
139
            the <SAMP
 
140
CLASS="computeroutput"
 
141
>NODE_TYPE</SAMP
 
142
> system attribute of a node file is expected
 
143
            to contain (<SAMP
 
144
CLASS="computeroutput"
 
145
>'file'</SAMP
 
146
>, as we have seen).  Although
 
147
            this is not expected to change, you should use <SPAN
 
148
CLASS="markup"
 
149
>FileNode.NodeType</SPAN
 
150
> instead of the
 
151
            literal <SAMP
 
152
CLASS="computeroutput"
 
153
>'file'</SAMP
 
154
> when possible.
 
155
          </P
 
156
><P
 
157
><SAMP
 
158
CLASS="computeroutput"
 
159
>newNode()</SAMP
 
160
> and <SAMP
 
161
CLASS="computeroutput"
 
162
>openNode()</SAMP
 
163
> are the
 
164
            equivalent to the Python <SAMP
 
165
CLASS="computeroutput"
 
166
>file()</SAMP
 
167
> call (alias
 
168
            <SAMP
 
169
CLASS="computeroutput"
 
170
>open()</SAMP
 
171
>) for ordinary files.  Their arguments
 
172
            differ from that of <SAMP
 
173
CLASS="computeroutput"
 
174
>file()</SAMP
 
175
>, but this is the
 
176
            only point where you will note the difference between
 
177
            working with a node file and working with an ordinary file.
 
178
          </P
 
179
><P
 
180
>For this little tutorial, we will assume that we have a
 
181
            <SAMP
 
182
CLASS="computeroutput"
 
183
>PyTables</SAMP
 
184
> database opened for writing. Also, if
 
185
            you are somewhat lazy at typing sentences, the code that we
 
186
            are going to explain is included in the
 
187
            <SAMP
 
188
CLASS="computeroutput"
 
189
>examples/filenodes1.py</SAMP
 
190
> file.
 
191
          </P
 
192
><P
 
193
>You can create a brand new file with these sentences:
 
194
          </P
 
195
><PRE
 
196
CLASS="screen"
 
197
>&#13;      &#62;&#62;&#62; import tables
 
198
            &#62;&#62;&#62; h5file = tables.openFile('fnode.h5', 'w')
 
199
          </PRE
 
200
><DIV
 
201
CLASS="sect2"
 
202
><H2
 
203
CLASS="sect2"
 
204
><A
 
205
NAME="subsection6.3.1"
 
206
>6.3.1. Creating a new file node</A
 
207
></H2
 
208
><P
 
209
>Creation of a new file node is achieved with the
 
210
              <SAMP
 
211
CLASS="computeroutput"
 
212
>newNode()</SAMP
 
213
> call.  You must tell it in which
 
214
              <SAMP
 
215
CLASS="computeroutput"
 
216
>PyTables</SAMP
 
217
> file you want to create it, where in
 
218
              the <SAMP
 
219
CLASS="computeroutput"
 
220
>PyTables</SAMP
 
221
> hierarchy you want to create the
 
222
              node and which will be its name.  The
 
223
              <SAMP
 
224
CLASS="computeroutput"
 
225
>PyTables</SAMP
 
226
> file is the first argument to
 
227
              <SAMP
 
228
CLASS="computeroutput"
 
229
>newNode()</SAMP
 
230
>; it will be also called the
 
231
              <SAMP
 
232
CLASS="computeroutput"
 
233
>'host PyTables file'</SAMP
 
234
>.  The other two
 
235
              arguments must be given as keyword arguments
 
236
              <SAMP
 
237
CLASS="computeroutput"
 
238
>where</SAMP
 
239
> and <SAMP
 
240
CLASS="computeroutput"
 
241
>name</SAMP
 
242
>, respectively.
 
243
              As a result of the call, a brand new appendable and
 
244
              readable file node object is returned.
 
245
            </P
 
246
><P
 
247
>So let us create a new node file in the previously opened
 
248
              <SAMP
 
249
CLASS="computeroutput"
 
250
>h5file</SAMP
 
251
> <SAMP
 
252
CLASS="computeroutput"
 
253
>PyTables</SAMP
 
254
> file, named
 
255
              <SAMP
 
256
CLASS="computeroutput"
 
257
>'fnode_test'</SAMP
 
258
> and placed right under the root
 
259
              of the database hierarchy.  This is that command:
 
260
            </P
 
261
><PRE
 
262
CLASS="screen"
 
263
>&#13;        &#62;&#62;&#62; fnode = FileNode.newNode(h5file, where='/', name='fnode_test')
 
264
            </PRE
 
265
><P
 
266
>That is basically all you need to create a file node.
 
267
              Simple, isn't it?  From that point on, you can use
 
268
              <SAMP
 
269
CLASS="computeroutput"
 
270
>fnode</SAMP
 
271
> as any opened Python file (i.e. you can
 
272
              write data, read data, lines of text and so on).
 
273
            </P
 
274
><P
 
275
><SAMP
 
276
CLASS="computeroutput"
 
277
>newNode()</SAMP
 
278
> accepts some more keyword
 
279
              arguments.  You can give a title to your file with the
 
280
              <SAMP
 
281
CLASS="computeroutput"
 
282
>title</SAMP
 
283
> argument.  You can use
 
284
              <SAMP
 
285
CLASS="computeroutput"
 
286
>PyTables</SAMP
 
287
>' compression features with the
 
288
              <SAMP
 
289
CLASS="computeroutput"
 
290
>filters</SAMP
 
291
> argument.  If you know beforehand the
 
292
              size that your file will have, you can give its final file
 
293
              size in bytes to the <SAMP
 
294
CLASS="computeroutput"
 
295
>expectedsize</SAMP
 
296
> argument so
 
297
              that the <SAMP
 
298
CLASS="computeroutput"
 
299
>PyTables</SAMP
 
300
> library would be able to
 
301
              optimize the data access.
 
302
            </P
 
303
><P
 
304
><SAMP
 
305
CLASS="computeroutput"
 
306
>newNode()</SAMP
 
307
> creates a <SAMP
 
308
CLASS="computeroutput"
 
309
>PyTables</SAMP
 
310
>
 
311
              node where it is told to.  To prove it, we will try to get
 
312
              the <SAMP
 
313
CLASS="computeroutput"
 
314
>NODE_TYPE</SAMP
 
315
> attribute from the newly created
 
316
              node.
 
317
            </P
 
318
><PRE
 
319
CLASS="screen"
 
320
>&#13;        &#62;&#62;&#62; print h5file.getNodeAttr('/fnode_test', 'NODE_TYPE')
 
321
              file
 
322
            </PRE
 
323
></DIV
 
324
><DIV
 
325
CLASS="sect2"
 
326
><H2
 
327
CLASS="sect2"
 
328
><A
 
329
NAME="subsection6.3.2"
 
330
>6.3.2. Using a file node</A
 
331
></H2
 
332
><P
 
333
>As stated above, you can use the new node file as any
 
334
              other opened file.  Let us try to write some text in and
 
335
              read it.
 
336
            </P
 
337
><PRE
 
338
CLASS="screen"
 
339
>&#13;        &#62;&#62;&#62; print &#62;&#62; fnode, "This is a test text line."
 
340
              &#62;&#62;&#62; print &#62;&#62; fnode, "And this is another one."
 
341
              &#62;&#62;&#62; print &#62;&#62; fnode
 
342
              &#62;&#62;&#62; fnode.write("Of course, file methods can also be used.")
 
343
              &#62;&#62;&#62;
 
344
              &#62;&#62;&#62; fnode.seek(0)  # Go back to the beginning of file.
 
345
              &#62;&#62;&#62;
 
346
              &#62;&#62;&#62; for line in fnode:
 
347
              ...   print repr(line)
 
348
              'This is a test text line.\n'
 
349
              'And this is another one.\n'
 
350
              '\n'
 
351
              'Of course, file methods can also be used.'
 
352
            </PRE
 
353
><P
 
354
>This was run on a Unix system, so newlines are expressed
 
355
              as <SAMP
 
356
CLASS="computeroutput"
 
357
>'\n'</SAMP
 
358
>.  In fact, you can override the line
 
359
              separator for a file by setting its
 
360
              <SAMP
 
361
CLASS="computeroutput"
 
362
>lineSeparator</SAMP
 
363
> property to any string you
 
364
              want.
 
365
            </P
 
366
><P
 
367
>While using a file node, you should take care of closing
 
368
              it <SPAN
 
369
CLASS="emphasis"
 
370
><I
 
371
CLASS="emphasis"
 
372
>before</I
 
373
></SPAN
 
374
> you close the
 
375
              <SAMP
 
376
CLASS="computeroutput"
 
377
>PyTables</SAMP
 
378
> host file.  Because of the way
 
379
              <SAMP
 
380
CLASS="computeroutput"
 
381
>PyTables</SAMP
 
382
> works, your data it will not be at a
 
383
              risk, but every operation you execute after closing the
 
384
              host file will fail with a <SAMP
 
385
CLASS="computeroutput"
 
386
>ValueError</SAMP
 
387
>.  To
 
388
              close a file node, simply delete the corresponding reference
 
389
              it or call its <SAMP
 
390
CLASS="computeroutput"
 
391
>close()</SAMP
 
392
> method.
 
393
            </P
 
394
><PRE
 
395
CLASS="screen"
 
396
>&#13;        &#62;&#62;&#62; fnode.close()
 
397
              &#62;&#62;&#62; print fnode.closed
 
398
              True
 
399
            </PRE
 
400
></DIV
 
401
><DIV
 
402
CLASS="sect2"
 
403
><H2
 
404
CLASS="sect2"
 
405
><A
 
406
NAME="subsection6.3.3"
 
407
>6.3.3. Opening an existing file node</A
 
408
></H2
 
409
><P
 
410
>If you have a file node that you created using
 
411
              <SAMP
 
412
CLASS="computeroutput"
 
413
>newNode()</SAMP
 
414
>, you can open it later by calling
 
415
              <SAMP
 
416
CLASS="computeroutput"
 
417
>openNode()</SAMP
 
418
>.  Its arguments are similar to
 
419
              that of <SAMP
 
420
CLASS="computeroutput"
 
421
>file()</SAMP
 
422
> or <SAMP
 
423
CLASS="computeroutput"
 
424
>open()</SAMP
 
425
>: the
 
426
              first argument is the <SAMP
 
427
CLASS="computeroutput"
 
428
>PyTables</SAMP
 
429
> node that you
 
430
              want to open (i.e. a node with a <SAMP
 
431
CLASS="computeroutput"
 
432
>NODE_TYPE</SAMP
 
433
>
 
434
              attribute having a <SAMP
 
435
CLASS="computeroutput"
 
436
>'file'</SAMP
 
437
> value), and the
 
438
              second argument is a mode string indicating how to open
 
439
              the file.  Contrary to <SAMP
 
440
CLASS="computeroutput"
 
441
>file()</SAMP
 
442
>,
 
443
              <SAMP
 
444
CLASS="computeroutput"
 
445
>openNode()</SAMP
 
446
> can not be used to create a new
 
447
              file node.
 
448
            </P
 
449
><P
 
450
>File nodes can be opened in read-only mode
 
451
              (<SAMP
 
452
CLASS="computeroutput"
 
453
>'r'</SAMP
 
454
>) or in read-and-append mode
 
455
              (<SAMP
 
456
CLASS="computeroutput"
 
457
>'a+'</SAMP
 
458
>).  Reading from a file node is allowed
 
459
              in both modes, but appending is only allowed in the second
 
460
              one.  Just like Python files do, writing data to an
 
461
              appendable file places it after the file pointer if it is
 
462
              on or beyond the end of the file, or otherwise after the
 
463
              existing data.  Let us see an example:
 
464
            </P
 
465
><PRE
 
466
CLASS="screen"
 
467
>&#13;        &#62;&#62;&#62; node = h5file.root.fnode_test
 
468
              &#62;&#62;&#62; fnode = FileNode.openNode(node, 'a+')
 
469
              &#62;&#62;&#62; print repr(fnode.readline())
 
470
              'This is a test text line.\n'
 
471
              &#62;&#62;&#62; print fnode.tell()
 
472
              26
 
473
              &#62;&#62;&#62; print &#62;&#62; fnode, "This is a new line."
 
474
              &#62;&#62;&#62; print repr(fnode.readline())
 
475
              ''
 
476
            </PRE
 
477
><P
 
478
>Of course, the data append process places the pointer at
 
479
              the end of the file, so the last <SAMP
 
480
CLASS="computeroutput"
 
481
>readline()</SAMP
 
482
>
 
483
              call hit <SAMP
 
484
CLASS="computeroutput"
 
485
>EOF</SAMP
 
486
>.  Let us seek to the beginning
 
487
              of the file to see the whole contents of our file.
 
488
            </P
 
489
><PRE
 
490
CLASS="screen"
 
491
>&#13;        &#62;&#62;&#62; fnode.seek(0)
 
492
              &#62;&#62;&#62; for line in fnode:
 
493
              ...   print repr(line)
 
494
              'This is a test text line.\n'
 
495
              'And this is another one.\n'
 
496
              '\n'
 
497
              'Of course, file methods can also be used.This is a new line.\n'
 
498
            </PRE
 
499
><P
 
500
>As you can check, the last string we wrote was correctly
 
501
              appended at the end of the file, instead of overwriting
 
502
              the second line, where the file pointer was positioned by
 
503
              the time of the appending.
 
504
            </P
 
505
></DIV
 
506
><DIV
 
507
CLASS="sect2"
 
508
><H2
 
509
CLASS="sect2"
 
510
><A
 
511
NAME="subsection6.3.4"
 
512
>6.3.4. Adding metadata to a file node</A
 
513
></H2
 
514
><P
 
515
>You can associate arbitrary metadata to any open node
 
516
              file, regardless of its mode, as long as the host
 
517
              <SAMP
 
518
CLASS="computeroutput"
 
519
>PyTables</SAMP
 
520
> file is writable.  Of course, you
 
521
              could use the <SAMP
 
522
CLASS="computeroutput"
 
523
>setNodeAttr()</SAMP
 
524
> method of
 
525
              <SAMP
 
526
CLASS="computeroutput"
 
527
>tables.File</SAMP
 
528
> to do it directly on the proper
 
529
              node, but <SPAN
 
530
CLASS="markup"
 
531
>FileNode</SPAN
 
532
> offers a
 
533
              much more comfortable way to do it.  <SAMP
 
534
CLASS="computeroutput"
 
535
>FileNode</SAMP
 
536
>
 
537
              objects have an <SAMP
 
538
CLASS="computeroutput"
 
539
>attrs</SAMP
 
540
> property which gives
 
541
              you direct access to their corresponding
 
542
              <SAMP
 
543
CLASS="computeroutput"
 
544
>AttributeSet</SAMP
 
545
> object.
 
546
            </P
 
547
><P
 
548
>For instance, let us see how to associate MIME type
 
549
              metadata to our file node:
 
550
            </P
 
551
><PRE
 
552
CLASS="screen"
 
553
>&#13;        &#62;&#62;&#62; fnode.attrs.content_type = 'text/plain; charset=us-ascii'
 
554
            </PRE
 
555
><P
 
556
>As simple as A-B-C.  You can put nearly anything in an
 
557
              attribute, which opens the way to authorship, keywords,
 
558
              permissions and more.  Moreover, there is not a fixed list
 
559
              of attributes.  However, you should avoid names in all
 
560
              caps or starting with <SAMP
 
561
CLASS="computeroutput"
 
562
>'_'</SAMP
 
563
>, since
 
564
              <SAMP
 
565
CLASS="computeroutput"
 
566
>PyTables</SAMP
 
567
> and <SPAN
 
568
CLASS="markup"
 
569
>FileNode</SPAN
 
570
> may use them internally.
 
571
              Some valid examples:
 
572
            </P
 
573
><PRE
 
574
CLASS="screen"
 
575
>&#13;        &#62;&#62;&#62; fnode.attrs.author = "Ivan Vilata i Balaguer"
 
576
              &#62;&#62;&#62; fnode.attrs.creation_date = '2004-10-20T13:25:25+0200'
 
577
              &#62;&#62;&#62; fnode.attrs.keywords_en = ["FileNode", "test", "metadata"]
 
578
              &#62;&#62;&#62; fnode.attrs.keywords_ca = ["FileNode", "prova", "metadades"]
 
579
              &#62;&#62;&#62; fnode.attrs.owner = 'ivan'
 
580
              &#62;&#62;&#62; fnode.attrs.acl = {'ivan': 'rw', '@users': 'r'}
 
581
            </PRE
 
582
><P
 
583
>You can check that these attributes get stored by running
 
584
              the <SAMP
 
585
CLASS="computeroutput"
 
586
>ptdump</SAMP
 
587
> command on the host
 
588
              <SAMP
 
589
CLASS="computeroutput"
 
590
>PyTables</SAMP
 
591
> file:
 
592
            </P
 
593
><PRE
 
594
CLASS="screen"
 
595
>&#13;        $ ptdump -a fnode.h5:/fnode_test
 
596
              /fnode_test (EArray(113,)) ''
 
597
              /fnode_test.attrs (AttributeSet), 14 attributes:
 
598
              [CLASS := 'EARRAY',
 
599
              EXTDIM := 0,
 
600
              FLAVOR := 'numarray',
 
601
              NODE_TYPE := 'file',
 
602
              NODE_TYPE_VERSION := 2,
 
603
              TITLE := '',
 
604
              VERSION := '1.2',
 
605
              acl := {'ivan': 'rw', '@users': 'r'},
 
606
              author := 'Ivan Vilata i Balaguer',
 
607
              content_type := 'text/plain; charset=us-ascii',
 
608
              creation_date := '2004-10-20T13:25:25+0200',
 
609
              keywords_ca := ['FileNode', 'prova', 'metadades'],
 
610
              keywords_en := ['FileNode', 'test', 'metadata'],
 
611
              owner := 'ivan']
 
612
            </PRE
 
613
><P
 
614
>Note that <SPAN
 
615
CLASS="markup"
 
616
>FileNode</SPAN
 
617
> makes no
 
618
              assumptions about the meaning of your metadata, so its
 
619
              handling is entirely left to your needs and imagination.
 
620
            </P
 
621
></DIV
 
622
></DIV
 
623
><DIV
 
624
CLASS="NAVFOOTER"
 
625
><HR
 
626
ALIGN="LEFT"
 
627
WIDTH="100%"><TABLE
 
628
SUMMARY="Footer navigation table"
 
629
WIDTH="100%"
 
630
BORDER="0"
 
631
CELLPADDING="0"
 
632
CELLSPACING="0"
 
633
><TR
 
634
><TD
 
635
WIDTH="33%"
 
636
ALIGN="left"
 
637
VALIGN="top"
 
638
><A
 
639
HREF="x5744.html"
 
640
ACCESSKEY="P"
 
641
>Prev</A
 
642
></TD
 
643
><TD
 
644
WIDTH="34%"
 
645
ALIGN="center"
 
646
VALIGN="top"
 
647
><A
 
648
HREF="index.html"
 
649
ACCESSKEY="H"
 
650
>Home</A
 
651
></TD
 
652
><TD
 
653
WIDTH="33%"
 
654
ALIGN="right"
 
655
VALIGN="top"
 
656
><A
 
657
HREF="x5875.html"
 
658
ACCESSKEY="N"
 
659
>Next</A
 
660
></TD
 
661
></TR
 
662
><TR
 
663
><TD
 
664
WIDTH="33%"
 
665
ALIGN="left"
 
666
VALIGN="top"
 
667
>Finding a <SPAN
 
668
CLASS="markup"
 
669
>FileNode</SPAN
 
670
>
 
671
            node</TD
 
672
><TD
 
673
WIDTH="34%"
 
674
ALIGN="center"
 
675
VALIGN="top"
 
676
><A
 
677
HREF="c5708.html"
 
678
ACCESSKEY="U"
 
679
>Up</A
 
680
></TD
 
681
><TD
 
682
WIDTH="33%"
 
683
ALIGN="right"
 
684
VALIGN="top"
 
685
>Complementary notes</TD
 
686
></TR
 
687
></TABLE
 
688
></DIV
 
689
></BODY
 
690
></HTML
 
691
>
 
 
b'\\ No newline at end of file'