0

Why does string formatting get ignored when ANSI escape sequence characters are included in the string?

Example (Python 3.9.1):

execution_times = [0, 12]
for execution_time in execution_times:
    affected_row_count = 26953
    c = ''
    cgrey = ''
    endc = ''
    
    if execution_time == 0:
        cgrey = '\33[90m'
    
    if execution_time > 0:
        c = '\033[94m'
        endc = '\033[0m'
    
    rows_affected_text = f' ({affected_row_count} rows affected)'
    elapsed_time_text = f'Elapsed Time: {c}{execution_time}{endc} secs'
    
    print(f'{cgrey}{elapsed_time_text:25s}{rows_affected_text}\033[0m')

Expected output would be:

Elapsed Time: 0 secs      (26953 rows affected)
Elapsed Time: 12 secs     (26953 rows affected)

but instead it yields

Elapsed Time: 0 secs      (26953 rows affected)
Elapsed Time: 12 secs (26953 rows affected)

The :25s string formatting is being ignored; what am I missing?

1 Answer 1

1

Because cgrey, c and endc are taken into account when calculating the alignment format.

Try to print raw bytes of the string.

# ...
    x = f'{cgrey}{elapsed_time_text:25s}{rows_affected_text}\033[0m'
    print(x)
    print(x.encode())

Result:

Elapsed Time: 0 secs      (26953 rows affected)
b'\x1b[90mElapsed Time: 0 secs      (26953 rows affected)\x1b[0m'
Elapsed Time: 12 secs (26953 rows affected)
b'Elapsed Time: \x1b[94m12\x1b[0m secs (26953 rows affected)\x1b[0m'
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.