Skip to content

Instantly share code, notes, and snippets.

@polymorphm
Last active December 19, 2015 22:49
Show Gist options
  • Save polymorphm/6030370 to your computer and use it in GitHub Desktop.
Save polymorphm/6030370 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
# -*- mode: python; coding: utf-8 -*-
assert str is not bytes
import sys
def main():
if len(sys.argv) not in (3, 4):
print('usage: {} <keyword> <path> [final_keyword]'.format(sys.argv[0]), file=sys.stderr)
exit(2)
keyword = sys.argv[1]
path = sys.argv[2]
if len(sys.argv) >= 4:
final_keyword = sys.argv[3]
else:
final_keyword = None
f_out = sys.stdout
buf = []
key_line_i = None
with open(path, 'r', encoding='utf-8', errors='replace') as f_in:
for line_i, line in enumerate(f_in):
if keyword.lower() in line.lower():
key_line_i = line_i
buf.append(line)
if key_line_i is None:
print('error: keyword not found in file', file=sys.stderr)
exit(1)
out_buf = buf[key_line_i:]
for line in out_buf:
f_out.write(line + '\n')
if final_keyword is not None and final_keyword.lower() in line.lower():
break
if __name__ == '__main__':
main()
#!/usr/bin/env python2
# -*- mode: python; coding: utf-8 -*-
# этот файл занимал бы в 2 раза меньше строчек,
# если он бы был написан НЕ на древней версии Python.
#
# так как можно было НЕ указывать операции связанные с перекодировками
# (а их тут не менее половины от всего кода)
from __future__ import absolute_import
assert str is bytes
assert unicode is not str
import sys, locale
def main():
if len(sys.argv) not in (3, 4):
print >> sys.stderr, 'usage: %s <keyword> <path> [final_keyword]' % sys.argv[0]
exit(2)
keyword_bytes = sys.argv[1]
path_bytes = sys.argv[2]
if len(sys.argv) >= 4:
final_keyword_bytes = sys.argv[3]
else:
final_keyword_bytes = None
assert isinstance(keyword_bytes, bytes)
assert isinstance(path_bytes, bytes)
assert final_keyword_bytes is None or isinstance(final_keyword_bytes, bytes)
locale_encoding = locale.getpreferredencoding() or 'utf-8'
fs_encoding = sys.getfilesystemencoding() or 'utf-8'
keyword = unicode(keyword_bytes, locale_encoding, 'replace')
path = unicode(path_bytes, locale_encoding, 'replace')
if final_keyword_bytes is not None:
final_keyword = unicode(final_keyword_bytes, locale_encoding, 'replace')
else:
final_keyword = None
f_out = sys.stdout
f_out_encoding = getattr(f_out, 'encoding', None) or 'utf-8'
buf = []
key_line_i = None
with open(path, 'rb') as f_in:
for line_i, raw_line in enumerate(f_in):
assert isinstance(raw_line, bytes)
line = unicode(raw_line, 'utf-8', 'replace')
if keyword.lower() in line.lower():
key_line_i = line_i
buf.append(line)
if key_line_i is None:
print >> sys.stderr, 'error: keyword not found in file'
exit(1)
out_buf = buf[key_line_i:]
for line in out_buf:
assert isinstance(line, unicode)
line_bytes = line.encode(f_out_encoding, 'replace')
f_out.write(line_bytes + '\n')
if final_keyword is not None and final_keyword.lower() in line.lower():
break
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment