cmdlineutils.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from __future__ import annotations
  2. import codecs
  3. import getopt
  4. import sys
  5. import time
  6. from typing import TextIO, Union
  7. import rdflib
  8. from rdflib.util import guess_format
  9. def _help():
  10. sys.stderr.write(
  11. """
  12. program.py [-f <format>] [-o <output>] [files...]
  13. Read RDF files given on STDOUT - does something to the resulting graph
  14. If no files are given, read from stdin
  15. -o specifies file for output, if not given stdout is used
  16. -f specifies parser to use, if not given it is guessed from extension
  17. """
  18. )
  19. def main(target, _help=_help, options="", stdin=True):
  20. """
  21. A main function for tools that read RDF from files given on commandline
  22. or from STDIN (if stdin parameter is true)
  23. """
  24. args, files = getopt.getopt(sys.argv[1:], "hf:o:" + options)
  25. dargs = dict(args)
  26. if "-h" in dargs:
  27. _help()
  28. sys.exit(-1)
  29. g = rdflib.Graph()
  30. if "-f" in dargs:
  31. f = dargs["-f"]
  32. else:
  33. f = None
  34. out: Union[TextIO, codecs.StreamReaderWriter]
  35. if "-o" in dargs:
  36. sys.stderr.write("Output to %s\n" % dargs["-o"])
  37. out = codecs.open(dargs["-o"], "w", "utf-8")
  38. else:
  39. out = sys.stdout
  40. start = time.time()
  41. if len(files) == 0 and stdin:
  42. sys.stderr.write("Reading from stdin as %s..." % f)
  43. g.parse(sys.stdin, format=f)
  44. sys.stderr.write("[done]\n")
  45. else:
  46. size = 0
  47. for x in files:
  48. if f is None:
  49. f = guess_format(x)
  50. start1 = time.time()
  51. sys.stderr.write("Loading %s as %s... " % (x, f))
  52. g.parse(x, format=f)
  53. sys.stderr.write(
  54. "done.\t(%d triples\t%.2f seconds)\n"
  55. % (len(g) - size, time.time() - start1)
  56. )
  57. size = len(g)
  58. sys.stderr.write(
  59. "Loaded a total of %d triples in %.2f seconds.\n"
  60. % (len(g), time.time() - start)
  61. )
  62. target(g, out, args)