47. fsglobal: high-level view op bestanden en directories

47.1. Inleiding

Brocade bevat twee Python modules om met bestanden om te gaan:

/core/python/fs.py
Dit is een per-file/per-directory beeld. De module bevat een een aantal elementaire instrumenten om met bestanden of directories om te gaan.
/core/python/fsglobal.py
Deze module laat toe om met ganse boomstructuren te werken. De module imiteert daarbij M globals. Deze module zelf is grotendeels ontwikkelt met behulp van /core/python/fs.py

De meeste Brocade toepassingen, die gerelateerd zijn met bewerken van data op OS niveau - in tegenstelling tot pure M applicaties - spelen zich af binnen in 1 directory en zijn subfolders.

/core/python/fsglobal.py is een hulpmiddel om dit soort boomstructuren op te zetten, af te breken, te manipuleren. Daartoe worden de M globals als model gebruikt: deze zijn eenvoudige te begrijpen instrumenten die heel dicht aanleunen bij de intrinsieke natuur van informatie.

47.2. Data model

fsglobal kan werken met twee soorten data modellen. Deze worden in beide gevallen gepresenteerd door een directory structuur in een filesystem.

  1. Boomstructuren in een filesysteem Dit is ofwel één enkel bestand, ofwel een directory met zijn subdirectories.
  2. Boomstructuren met een gepriviligeerde bestandsnaam Dit is opnieuw één enkel bestand, ofwel een directory met zijn subdirectories. Er wordt nu echter een bestandsnaam opgegeven die speciaal is: de inhoud van het bestand bevat informatie over de directory zelf. Dit is te vergelijken met een M-global: behalve eigen subscripts kan d eglobal referentie zelf ook data bevatten.

47.3. Bestandsnamen

Bestandsnamen in een UNIX filesysteem kennen beperkingen afhankelijk van de systeemconfiguratie.

  • lengte van de filenaam
  • éénduidigheid (lowercase vs. uppercase)
  • sommige karakters zijn niet toegelaten

Daar waar mogelijk is het aan te raden om te werken met bestandsnamen die samengesteld zijn uit: ‘A-Z’, ‘a-z’, 0-9’, ‘_’, ‘-‘, ‘.’ en die niet beginnen met ‘-‘ (POSIX portable names)

47.4. Globals

Een fsglobal wordt voorgesteld door een base path in het filesysteem.

Let op

Dit base path kan verwijzen naar:

  • een directory
  • een bestand
  • of gewoonweg een path dat niet bestaat!

Bij elke fsglobal hoort ook een valuestore.

De valuestore kan essentieel twee soorten waarden bevatten:

  1. De valuestore is een karakterrij gevormd uit de karakters ‘a-z’, ‘A-Z’, ‘0-9’ en de underscore. Deze valuestore is een gepriviligeerde bestandsnaam: hij dient om gegevens weg te schrijven bij de directory zelf. (Te vergelijken met M globals met een $D waarde van 11)
  2. De valuestore is None`. Dan bestaan er geen gepriviligeerde bestanden en waarden bij de directories zelf kunnen niet worden weggeschreven.

Voorbeeld:

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> fsglobal = FSGlobal("~/BCAT", valuestore="_")
>>> print fsglobal.base
/home/rphilips/BCAT

47.5. Subscripts

Een subscript kan op verschilende manieren worden gespecificeerd:

  • een subscript kan leeg of None zijn. De subscript duidt het base path aan.
  • floats (af te raden) of ints worden omgezet naar strings
  • strings kunnen path componenten bevatten gescheiden door een /
  • een tuple of een list: elk element bevat een component van het path
  • de subscript kan tenslotte een geneste structuur van de bovenstaande elementen bevatten.

Voorbeelden:

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> fsglobal = FSGlobal("~/BCAT")
>>>
>>> print fsglobal.path()
/home/rphilips/BCAT
>>>
>>> print fsglobal.path("")
/home/rphilips/BCAT
>>>
>>> print fsglobal.path(None)
/home/rphilips/BCAT
>>>
>>> print fsglobal.path(0)
/home/rphilips/BCAT/0
>>>
>>> print fsglobal.path("lvd")
/home/rphilips/BCAT/lvd
>>>
>>> print fsglobal.path("lvd/236126/pk/UA-CST")
/home/rphilips/BCAT/lvd/236126/pk/UA-CST
>>>
>>> print fsglobal.path("lvd", 324517, "pk", "UA-CST")
/home/rphilips/BCAT/lvd/324517/pk/UA-CST
>>>
>>> print fsglobal.path(["lvd","324517/pk/UA-CST",("A",("B", "C"), "D")])
/home/rphilips/BCAT/lvd/324517/pk/UA-CST/A/B/C/D

Subscripts en waarden van de fsglobal worden op de volgende wijze georganiseerd:

$D(fsglobal) = 0

Er zijn twee mogelijkheden:

  1. Het base path bestaat niet in het filesysteem
  2. Het base path bestaat en is een directory zonder bestanden.
$D(fsglobal) = 1
Het base path verwijst naar een bestand dat de waarde bevat
$D(fsglobal) = 10
Het base path verwijst naar een directory. Deze directory is niet leeg en de basenames van de bestanden en subdirectories in deze directory zijn de subscripts van de fsglobal. De bestanden bevatten dan de waarde.
$D(fsglobal) = 11
Het path verwijst naar een directory. Dezelfde regels als voor $D(fsglobal) = 10 gaan op. Echter, deze directory bevat ook een bestand met basename gelijk aan de valuestore.

Notitie

Hou rekening met de volgende aspecten:

  • Sommige OS maken geen onderscheid tussen lowercase en uppercase in de bestandsnamen.
  • Van zodra $D(fsglobal) > 1, is fsglobal een directory die minstens 1 bestand met een basename verschillend van de valuestore bevat. Het systeem zelf onderhoudt op transparante wijze de omvorming van file naar directory en omgekeerd.
  • Bewerk de fsglobal bij voorkeur met de instrumenten van de fsglobal.

Voorbeeld:

#!/bin/bash
find BCAT -name '*' -print
BCAT
BCAT/lvd
BCAT/lvd/1000000
BCAT/lvd/1000000/pk
BCAT/lvd/1000000/pk/KUL-C
BCAT/lvd/1000000/pk/KUL-C/_
BCAT/lvd/1000000/pk/KUL-C/p:lvd:4988948
BCAT/lvd/1000000/pk/AHB
BCAT/lvd/1000000/pk/AHB/p:lvd:2157466
BCAT/lvd/1000000/pk/AHB/_
BCAT/lvd/1000000/ti
BCAT/lvd/1000000/ti/2
BCAT/lvd/1000000/ti/1
BCAT/lvd/1000000/_

47.6. Opzetten van een fsglobal

Voorbeeld:

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> fsglobal = FSGlobal("~/BCAT")
>>> print fsglobal
/home/rphilips/BCAT

De constructor kan worden aangestuurd met diverse sleutelwoorden:

base
Dit is de base path waarop de global is gevestigd. In het voorbeeld is dat /home/rphilips/BCAT
fpathmode

Deze string waarde regelt - bij de aanmaak van bestanden - ownership en access.

Default: processfile

dpathmode

Deze string waarde specificeert - bij de aanmaak van directories - ownership en access.

Default: processdir

mtime

Een booleaanse waarde die aangeeft of een aanpassing aan een bestand ook de modification time van de ouder(s) aanpast (tot op het base path). Dit heeft als voordeel dat er heel snel kan worden gezocht naar bestanden die zijn veranderd.

Default: False

valuestore

De basename voor de waarden van de directories zelf.

Default: _

fobjbuffering

Deze waarde is None (in dit geval wordt, bij access, steeds gewerkt met de inhoud van de betreffende file.)

Is dit een getal kleiner dan 0, dan wordt een file object teruggegeven met read buffering bepaald door het systeem.

Is dit een getal gelijk aan 0, dan wordt een file object teruggegeven zonder read buffering

Is dit een getal gelijk aan 1, dan wordt een file object teruggegeven met lijn buffering

Is dit een getal groter dan 1, dan wordt een file object teruggegeven met deze buffer grootte

Default: None

default

Is deze waarde verschillende van None, dan wordt deze teruggeven indien de subscripts niet bestaan.

Default: None

47.7. Invullen van bestanden (subscripts)

47.7.1. Werken met strings

In de plaats van strings mogen ook integers worden gebruikt.

Voorbeeld:

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> BCAT = FSGlobal("~/BCAT")
>>>
>>> BCAT["lvd",1000,"ti",1] = "De eerste"
>>> print BCAT["lvd",1000,"ti",1]
De eerste
>>>
>>> BCAT[["lvd",1000,"ti",2]] = "De tweede"
>>> print BCAT["lvd",1000,"ti",2]
De tweede
>>>
>>> BCAT["lvd/1000/ti/3"] = "De derde"
>>> print BCAT["lvd",1000,"ti",3]
De derde
>>>
>>> BCAT["lvd/1000","ti/4"] = "De vierde"
>>> print BCAT["lvd",1000,"ti",4]
De vierde

De subscripts kunnen op een heel flexibele manier worden ingevoerd:

  • als een tuple
  • als een list van lists
  • door middel van de / separator (ook op Windows)
  • door mengvormen

Deze flexibiliteit wordt aangehouden in alle relevante methodes.

47.7.2. Werken met fileobjects

Het vullen van de bestanden hoeft niet uitsluitend te gebeuren aan de hand van strings. Ook fileobjects zijn toegelaten:

>>> from anet.core.fsglobal import FSGlobal
>>> from anet.core import fs
>>>
>>> fs.store("context.txt", "dataaaaaaa")
'dataaaaaaa'
>>>
>>> BCAT = FSGlobal("~/BCAT")
>>>
>>>
>>> f = open("context.txt", "rb")
>>> BCAT["irua",123,"text"] = f
>>>
>>> f.close()
>>>
>>> print BCAT["irua",123,"text"]
dataaaaaaa

47.7.3. Werken met dicts

Waarden kunnen ook met behulp van een dict worden gedefinieerd:

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> BCAT = FSGlobal("BCAT")
>>>
>>> BCAT["lvd",123] = {'ti': 'Titel', 'au': 'Auteur', 'pk': {'UA-CST': 'Stadscampus', 'UA-CDE': 'Buitencampus'}}
>>>
>>> print BCAT["lvd",123,"pk","UA-CDE"]
Buitencampus

Deze dicts kunnen genest zijn.

47.7.4. Werken met fsglobals

Dit is een bijzonder krachtig middel om te werken met bestanden en directories:

>>> import os.path
>>> from anet.core import fs
>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir1 = FSGlobal("Dir1")
>>>
>>> fs.store("myfile.tmp", "Hello there!")
'Hello there!'
>>>
>>> os.path.exists("Dir1")
True
>>>
>>> Dir1["a/b/c"] = FSGlobal("myfile.tmp")
>>>
>>> Dir1["a/b/c"]
'Hello there!'

Of nog:

>>> import os.path
>>> from anet.core import fs
>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir1 = FSGlobal("Dir1")
>>>
>>> fs.store("myfile.tmp", "Hello there!")
'Hello there!'
>>>
>>> os.path.exists("Dir1")
True
>>>
>>> Dir1["a/b/c"] = FSGlobal("myfile.tmp")
>>>
>>> Dir1["a/b/c"]
'Hello there!'
>>>
>>>
>>> Dir2 = FSGlobal("Dir2")
>>>
>>> Dir2["A/B/C/D"] = Dir1
>>>
>>> Dir2["A/B/C/D/a/b/c"]
'Hello there!'

47.7.5. Werken met None

Dit biedt de mogelijkheid om de valuestore te schrappen:

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir1 = FSGlobal("Dir1", valuestore="_")
>>>
>>> Dir1["a/b"] = "AB"
>>>
>>> Dir1["a"] = "A"
>>>
>>> Dir1["a"]
'A'
>>>
>>> Dir1["a","b"]
'AB'
>>>
>>> Dir1["a"] = None
>>>
>>> Dir1["a/b"]
'AB'
>>> Dir1["a"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/anet/core/fsglobal.py", line 108, in __getitem__
    raise KeyError(path + " --> Path does not exists and default is None")
KeyError: '/home/rphilips/Dir1/a --> Path does not exists and default is None'
>>>

47.8. Lezen van bestanden (subscripts)

De inhoud van bestanden in een fsglobal kunnen worden opgevist met behulp van subscripts.

>>> from anet.core import fs
>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir = FSGlobal("myDir", valuestore="_")
>>>
>>> Dir["a/b"] = "AB"
>>>
>>> Dir["a"] = "A"
>>>
>>> Dir["a"]
'A'
>>> fs.makedir("myDir/e")
>>>
>>> fs.store("myDir/e/f", "EF")
'EF'
>>> Dir["e","f"]
'EF'
>>> Dir.get("e/f")
'EF'
>>> Dir.get("x/y/z", default="XYZ")
'XYZ'

Door te werken met de fobjbuffering parameter kan men ook met fileobjecten in plaats van met strings werken.

Verder werkend met het vorige voorbeeld:

>>> Dir.fobjbuffering = -1
>>>
>>> f = Dir["e","f"]
>>>
>>> f.read()
'EF'
>>> f.close()

Of, nog beter:

>>> Dir.fobjbuffering = -1
>>>
>>> f = Dir["e","f"]
>>>
>>> with f:
...     print f.read()
...
EF

47.9. fsglobals in fsglobals

De subscripts kunnen ook helpen bij het creëeren van nieuwe fsglobals: (let op de ronde haken)

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir = FSGlobal("a/b/c/d/e")
>>>
>>> Dir["g/h/i/j"] = "ABCDEFGHIJ"
>>>
>>> SubDir = Dir("g", "h")
>>>
>>> Dir.base
'/home/rphilips/a/b/c/d/e'
>>> SubDir.base
'/home/rphilips/a/b/c/d/e/g/h'
>>> SubDir["i/j"]
'ABCDEFGHIJ'
>>> SubDir["x/y/z"] = "XYZ"
>>>
>>> Dir["g/h/x/y/z"]
'XYZ'
>>>

47.10. Schrappen van bestanden

47.10.1. Schrappen van de valuestore

Deze techniek werkt vanzelfsprekend indien er een valuestore werd gedefinieerd. Indien er geen valuestore werd gedefinieerd, dan doet de tecchniek niets.

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir1 = FSGlobal("Dir1", valuestore="_")
>>>
>>> Dir1["a/b"] = "AB"
>>>
>>> Dir1["a"] = "A"
>>>
>>> Dir1["a"]
'A'
>>>
>>> Dir1["a","b"]
'AB'
>>>
>>> Dir1["a"] = None # schrap de valuestore
>>>
>>> Dir1["a/b"]
'AB'
>>> Dir1["a"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/anet/core/fsglobal.py", line 108, in __getitem__
    raise KeyError(path + " --> Path does not exists and default is None")
KeyError: '/home/rphilips/Dir1/a --> Path does not exists and default is None'
>>>

47.10.2. Schrappen van een boomstructuur met del

Het schrappen kan op drie manieren:

  1. De M-methode: fsglobal.kill("a", "b")
  2. De Python-methode: del fsglobal["a", "b"]
  3. Er is nog een derde methode die de ganse boomstructuur schrapt: fsglobal.clear()
>>> from anet.core.fsglobal import FSGlobal
>>> import os.path
>>>
>>> Dir = FSGlobal("myDir")
>>>
>>> Dir["a/p"] = "AP"
>>>
>>> Dir["a/b/c/d/e/f"] = "ABCDEF"
>>>
>>> Dir["a/b/c/x/y/z"] = "ABCXYZ"
>>>
>>> del Dir["a/b/c/x"]
>>>
>>> Dir["a/b/c/x/y/z"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/anet/core/fsglobal.py", line 108, in __getitem__
    raise KeyError(path + " --> Path does not exists and default is None")
KeyError: '/home/rphilips/myDir/a/b/c/x/y/z --> Path does not exists and default is None'
>>>
>>> Dir.kill("a", "b", "c", "d")
>>>
>>> Dir["a", "b", "c", "d"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/anet/core/fsglobal.py", line 108, in __getitem__
    raise KeyError(path + " --> Path does not exists and default is None")
KeyError: '/home/rphilips/myDir/a/b/c/d --> Path does not exists and default is None'
>>>
>>> Dir["a", "p"]
'AP'
>>>
>>> os.path.exists("myDir")
True
>>> Dir.clear()
>>>
>>> os.path.exists("myDir")
False

47.11. Introspectie instrumenten

47.11.1. Het path van een bestand

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir = FSGlobal("myDir")
>>>
>>> Dir.base
'/home/rphilips/myDir'
>>>
>>> str(Dir)
'/home/rphilips/myDir'
>>>
>>> Dir.path()
'/home/rphilips/myDir'
>>>
>>> Dir.path("a", "b", "c")
'/home/rphilips/myDir/a/b/c'
>>>
>>> Dir.path("a/b/c")
'/home/rphilips/myDir/a/b/c'
>>>
>>> Dir.relpath("a", "b", "c")
'a/b/c'
>>>

47.11.2. Het $DATA van een fsglobal

Notitie

Merk de volgende verschillen op:

  1. fsglobal.data geeft hetzelfde resultaat als int(fsglobal). fsglobal.data kan echter wel met subscripts worden gebruikt.
  2. fsglobal.data en fsglobal.exists hebben nagenoeg dezelfde functionaliteit. Indien echter fsglobal.path NIET bestaat in het filesysteem, dan geeft de eerste 0 terug, terwijl de tweede None oplevert.
>>> from anet.core import fs
>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir = FSGlobal("myDir")
>>>
>>> Dir.clear()
>>>
>>> Dir.data()
0
>>> int(Dir)
0
>>> print Dir.exists()
None
>>> fs.makedir("myDir")
>>>
>>> Dir.data()
0
>>> int(Dir)
0
>>> print Dir.exists()
0
>>>
>>> Dir["a", "b"] = "AB"
>>>
>>> Dir.data()
10
>>> Dir.data("a")
10
>>> int(Dir)
10
>>> print Dir.exists()
10
>>> Dir.valuestore = "_"
>>>
>>> Dir["a"] = "A"
>>>
>>> Dir.data()
10
>>> Dir.data("a")
11
>>> int(Dir)
10
>>> print Dir.exists()
10
>>>

47.11.3. De lengte van een fsglobal

Telt het aantal reguliere bestanden in een fsglobal.

>>> from anet.core import fs
>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir = FSGlobal("myDir")
>>>
>>> Dir.clear()
>>>
>>> len(Dir)
0
>>> fs.makedir("myDir")
>>>
>>> len(Dir)
0
>>> Dir["a/b/c/d"] = "ABCD"
>>>
>>> len(Dir)
1
>>> Dir.valuestore = "_"
>>>
>>> Dir["a/b"] = "AB"
>>>
>>> len(Dir)
2

47.11.4. De grootte van een fsglobal

berekent de totale hoeveelheid bytes dat de fsglobal inneemt:

>>> from anet.core import fs
>>> from anet.core.fsglobal import FSGlobal
>>>
>>> Dir = FSGlobal("myDir")
>>>
>>> Dir.clear()
>>>
>>> Dir["a/b"] = "AB"
>>> Dir["x/y/z"] = "XYZ"
>>>
>>> Dir.size()
5
>>>

47.12. Iterators

In de volgende paragrafen gaan we er steeds van uit dat:

>>> from anet.core import fs
>>> from anet.core.fsglobal import FSGlobal
>>>
>>> fsglobal = FSGlobal("myDir", valuestore = "_")

werd uitgevoerd.

47.12.1. fsglobal is een iterator

Alle subscript met waarden worden aangeleverd. De eventuele waarde bij subscript “” (fsglobal.base) wordt echter niet meegeleverd.

>>> fsglobal.clear()
>>>
>>> list(fsglobal)
[]
>>> fsglobal[""] = "BASE"
>>>
>>> list(fsglobal)
[]
>>> fsglobal["x/y/z"] = "XYZ"
>>>
>>> fsglobal["x"] = "X"
>>>
>>> list(fsglobal)
[('x',), ('x', 'y', 'z')]
>>>

47.12.2. fsglobal.yieldtuples(*key, **kwargs)

Genereert alle tuples die onder het argument liggen en een waarde hebben. Met recurse=True kan men ook alle diepere niveaus opzoeken.

>>> fsglobal.clear()
>>>
>>> fsglobal["x/y/z"] = "XYZ"
>>>
>>> fsglobal["x"] = "X"
>>>
>>> fsglobal["x/u"] = "XU"
>>> list(fsglobal.yieldtuples("x"))
[('u',)]
>>>
>>> list(fsglobal.yieldtuples("x", recurse=True))
[('u',), ('y', 'z')]
>>>

47.12.3. fsglobal.order(*key)

Genereert alle strings die onder het argument liggen. De $Data van dat resultaat kan echter wel 0 zijn (bij een lege directory).

>>> fsglobal.clear()
>>>
>>> fsglobal["x/y/z"] = "XYZ"
>>>
>>> fsglobal["x"] = "X"
>>>
>>> fsglobal["x/u"] = "XU"
>>>
>>> list(fsglobal.order("x"))
['u', 'y']
>>>

47.12.4. fsglobal.yieldfiles(*key, **kwargs)

Dit is een abstractie van fs.yieldfiles. Gebruik dezelfde keywords:

>>> fsglobal.clear()
>>>
>>> fsglobal["x/y/z"] = "XYZ"
>>>
>>> fsglobal["x"] = "X"
>>>
>>> fsglobal["x/u"] = "XU"
>>>
>>> list(fsglobal.yieldfiles("x"))
['/home/rphilips/myDir/x/u', '/home/rphilips/myDir/x/_']
>>>

47.12.5. fsglobal.yielddirs(*key, **kwargs)

Dit is een abstractie van fs.yielddirs. Gebruik dezelfde keywords:

>>> fsglobal.clear()
>>>
>>> fsglobal["x/y/z"] = "XYZ"
>>>
>>> fsglobal["x"] = "X"
>>>
>>> fsglobal["x/u"] = "XU"
>>>
>>> list(fsglobal.yielddirs("x"))
['/home/rphilips/myDir/x/y']
>>>

47.13. Acties op een fsglobal

In de volgende paragrafen gaan we er steeds van uit dat:

>>> from anet.core import fs
>>> from anet.core.fsglobal import FSGlobal
>>>
>>> fsglobal = FSGlobal("myDir", valuestore = "_")

werd uitgevoerd.

47.13.1. fsglobal.map(f, iterable=None)

f is een functie met 2 parameters:

  1. De eeste parameter is fsglobal zelf
  2. De tweede parameter is een element uit de iterable. (Is deze None, dan is deze gelijk aan de fsglobal.)

De method overloopt de iterable en voert de functie uit op de elementen van de iterable:

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> fsglobal = FSGlobal("myDir")
>>>
>>> fsglobal.clear()
>>>
>>> fsglobal["a1/b1/c1"] = "xyz1"
>>>
>>> fsglobal["a2/b2/c2"] = "xyz11"
>>>
>>> fsglobal["a3/b3/c3"] = "xyz111"
>>>
>>> def f(g, p): g[p] = g[p].upper()
>>>
>>> fsglobal.map(f)
[None, None, None]
>>> fsglobal["a2/b2/c2"]
'XYZ11'

47.13.2. fsglobal.filter(f, iterable=None)

f is een functie met 2 parameters die True | False teruggeeft.

  1. De eeste parameter is fsglobal zelf
  2. De tweede parameter is een element uit de iterable. Is deze None, dan is deze gelijk aan de fsglobal.

De method overloopt de iterable en geeft een lijst terug met de elementen van de iterable waarvoor de functie True is. .. code-block:: pycon

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> fsglobal = FSGlobal("myDir")
>>>
>>> fsglobal.clear()
>>>
>>> fsglobal["a1/b1/c1"] = "xyz1"
>>>
>>> fsglobal["a2/b2/c2"] = "xyz11"
>>>
>>> fsglobal["a3/b3/c3"] = "xyz111"
>>>
>>> f = lambda g, p: g[p].count("1")>1
>>>
>>> fsglobal.filter(f)
[('a2', 'b2', 'c2'), ('a3', 'b3', 'c3')]
>>>
>>> fsglobal.map(lambda g, p: g.path(p), fsglobal.filter(f))
['/home/rphilips/Tmp/myDir/a2/b2/c2', '/home/rphilips/Tmp/myDir/a3/b3/c3']
>>>

47.13.3. fsglobal.glob(*patterns)

Matcht de relatieve pathnamen van de bestanden tegen de patronen (AND)

>>> from anet.core.fsglobal import FSGlobal
>>>
>>> fsglobal = FSGlobal("myDir")
>>>
>>> fsglobal.clear()
>>>
>>> fsglobal["a/b/image.jpg] = "image"
>>>
>>> fsglobal["x/y/document.pdf"] = "y-pdf"
>>>
>>> fsglobal["x/z/document.pdf"] = "z-pdf"
>>>
>>> fsglobal.glob("*.pdf")
[('x', 'z', 'document.pdf'), ('x', 'y', 'document.pdf')]
>>>
>>> fsglobal.glob("*.jpg","*z*")
[('a', 'b', 'image.jpg'), ('x', 'z', 'document.pdf')]
>>>