def partition_words(words, k):
    """
    Given a list of words, maximally split them into lists such that the length with space separators is at most k.
    :param words: the list of words
    :param k: the maximum line length
    :return: a list of lists of words

    >>> partition_words(['the', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog'], 16)
    [['the', 'quick', 'brown'], ['fox', 'jumps', 'over'], ['the', 'lazy', 'dog']]
    >>> partition_words([], 100)
    []
    >>> partition_words(['one'], 5)
    [['one']]
    """
    # I don't know if there's a better way to do this using a list partitioning utility.
    # For complexity, reverse the list.
    reversed_words = list(reversed(words))

    lines = []
    line = []
    currlength = 0

    while reversed_words:
        word = reversed_words.pop()
        if currlength + len(word) <= k:
            line.append(word)
            currlength += len(word) + 1
        else:
            lines.append(line)
            line = [word]
            currlength = len(word) + 1

    if line:
        lines.append(line)

    return lines