Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.43 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. import argparse
  3. import logging
  4. import sys
  5.  
  6.  
  7. def make_parser():
  8. parser = argparse.ArgumentParser(
  9. description='Select column(s) of CSV file by name assuming the first '
  10. 'row of the CSV lists the column names. Currently the '
  11. 'script does not support quoting.')
  12. parser.add_argument('-d', '--delimiter', default=',',
  13. help='field delimiter, default to comma')
  14. parser.add_argument('-F', '--no-print-field', action='store_false',
  15. dest='print_field',
  16. help='to print the selected title')
  17. parser.add_argument('-S', '--strict', action='store_true',
  18. help='raise error if one of FIELDs does not exist')
  19. parser.add_argument('fields', nargs='*', metavar='FIELD',
  20. help='FIELD to select')
  21. return parser
  22.  
  23.  
  24. def _main():
  25. args = make_parser().parse_args()
  26. logging.basicConfig(format='%(filename)s: %(levelname)s: %(message)s',
  27. level=logging.DEBUG)
  28. try:
  29. infile = sys.stdin
  30. titles = next(infile).rstrip('\n').split(args.delimiter)
  31. indices = []
  32. for i, x in enumerate(args.fields):
  33. try:
  34. j = titles.index(x)
  35. except ValueError:
  36. if args.strict:
  37. logging.error('Field "%s" does not exist; aborted',
  38. args.fields[i])
  39. return 4
  40. logging.warning('Field %s does not exist', args.fields[i])
  41. else:
  42. indices.append(j)
  43. if args.print_field:
  44. print(args.delimiter.join(titles[j] for j in indices))
  45. if args.fields:
  46. for line in infile:
  47. tokens = line.rstrip('\n').split(args.delimiter)
  48. try:
  49. filtered_line = [tokens[j] for j in indices]
  50. except IndexError:
  51. filtered_line = []
  52. for jj in indices:
  53. try:
  54. filtered_lin.append(tokens[jj])
  55. except IndexError:
  56. pass
  57. if filtered_line:
  58. print(args.delimiter.join(filtered_line))
  59. except KeyboardInterrupt:
  60. return 130
  61. except BrokenPipeError:
  62. sys.stderr.close()
  63. else:
  64. return 0
  65.  
  66.  
  67. if __name__ == '__main__':
  68. sys.exit(_main())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement