Skip to content

Instantly share code, notes, and snippets.

@gustavorv86
Created May 16, 2019 12:45
Show Gist options
  • Save gustavorv86/be495f0efc5b6910f9dfa86ba402161a to your computer and use it in GitHub Desktop.
Save gustavorv86/be495f0efc5b6910f9dfa86ba402161a to your computer and use it in GitHub Desktop.
Check if file contains ASCII printable characters.
#!/usr/bin/env python3
import os
import sys
PRINTABLE_ASCII = [
9, 10, 13, (32, 126)
]
def to_complete_list(mixed_list):
complete_list = list()
for item in mixed_list:
if isinstance(item, tuple):
if len(item) != 2:
print("WARN: Invalid format list")
continue
minor = item[0]
major = item[1]
if not isinstance(minor, int) or not isinstance(major, int):
print("WARN: Invalid format list")
continue
for i in range(minor, major + 1):
complete_list.append(i)
elif isinstance(item, int):
complete_list.append(item)
else:
print("WARN: Invalid format list")
return complete_list
def main(args):
if len(args) <= 1:
print("ERROR: Invalid parameters")
exit(1)
filename = args[1]
if not os.path.isfile(filename):
print("ERROR: Filename {} not found".format(filename))
exit(2)
printable_ascii_list = to_complete_list(PRINTABLE_ASCII)
# Binary read
file_desc = open(filename, "rb")
read_bytes = 0
count_line = 1
flag_continue = True
while flag_continue:
byte = file_desc.read(1)
read_bytes += 1
d_byte = int.from_bytes(byte, "big")
if d_byte == 0:
# End of file
print("INFO: End of file '{}', read bytes '{}', number of lines '{}'".format(filename, read_bytes, count_line))
flag_continue = False
elif d_byte == 10:
# New line
count_line += 1
elif not d_byte in printable_ascii_list:
print("WARN: File '{}', read bytes '{}', non printable char '{}' at line '{}'".format(filename, read_bytes, d_byte, count_line))
flag_continue = False
file_desc.close()
if __name__ == "__main__":
main(sys.argv)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment