import sys
# set the file name depending on the operating system
if sys.platform == 'win32':
file = r'C:\WINDOWS\system32\drivers\etc\services'
else:
file = '/etc/services'
# Create an empty dictionary
ports = dict()
# Iterate through the file, one line at a time
for line in open(file):
# Ignore lines starting with '#' and those containing only whitespace
if line[0:1] != '#' and not line.isspace():
# Extract the second field (seperated by \s+)
pp = line.split(None, 1)[1]
# Extract the port number from port/protocol
port = pp.split ('/', 1)[0]
# Convert to int, then store as a dictionary key
port = int(port)
ports[port] = None
# Give up after port 200
if port > 200: break
# Print any port numbers not present as a dictionary key
for num in xrange(1,201):
if not num in ports:
print "Unused port", num
Here is a smaller solution using Regular Expressions:
import sys,re
file = r'C:\WINDOWS\system32\drivers\etc\services' \
if sys.platform == 'win32' else '/etc/services'
found = set()
for line in open(file):
m = re.search(r'^[^#].*\s(\d+)/(tcpudp)\s',line)
if m:
port = int(m.groups()[0])
if port > 200: break
found.add(port)
print set(range(1,201)) - found