简体   繁体   中英

Python string format ignored when ANSI escape sequence characters are in the string

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?

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'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM