/ / neutralizovať neviditeľné znaky ASCII pre tlač tabuľky ASCII - python, string, python-2.7, non-printing-characters

neutralizovať neviditeľné znaky ASCII pre tlač ASCII tabuľky - python, string, python-2.7, non-printing-characters

Snažím sa napísať krátky skript (pre tutoriál), ktorý ukáže, ktoré z prvých 128 znakov ASCII sú tlačiteľné, rozpoznateľné znaky.

Nasledujúci skript, ktorý používa reťazec `is in string.printable ', čiastočne funguje, ale stále spúšťa veci, ako sú linky, atď.

Existuje jedna alebo dve ďalšie riadky, ktoré môžem pridať do pasce a nahradiť tieto riadiace znaky medzerami tak, aby tabuľka vyzerala pekne a zobrazuje znaky, ktoré je možné vytlačiť?

Napísané z dlhej ruky pre noob-čitateľnosť:

import string
lines = []
for i in range(8):
line = []
for j in range(16):
k = i + j *16
thing = chr(k)
if thing not in string.printable:
thing = " "
line.append(thing)
lines.append(line)

for line in lines:
print "".join(line)

IDLE:

tu zadajte popis obrázku

Skopírujte / prilepte do SE vrátane štyroch miest:

   0@P`p
!1AQaq
"2BRbr
#3CScs
$4DTdt
%5EUeu
&6FVfv
"7GWgw
(8HXhx
)9IYiy

*:JZjz
+;K[k{
,<Ll|

- = M] m} .> N ^ n ~ /? O_o

odpovede:

1 pre odpoveď č. 1

Aktualizovaný kód nahradiť nepotlačiteľné znaky podľa komentára OP.

from string import printable, whitespace

replace_ch = " "  # The character to replace non-printable characters with
whitespace_ch = " "  # The character to replace whitespace characters with

# For console output
out_width = 8
out_height = 16

chars = [chr(i) for i in range(128)]
# Replace whitespace characters
chars = [whitespace_ch if c in whitespace else c for c in chars]
# Replace non-printable characters
chars = [c if c in printable else replace_ch for c in chars]
# Form lines for printing
lines = [[chars[i + j * out_height] for j in range(out_width)] for i in range(out_height)]

for line in lines:
print("".join(line))

výstupy:

   0@P`p
!1AQaq
"2BRbr
#3CScs
$4DTdt
%5EUeu
&6FVfv
"7GWgw
(8HXhx
)9IYiy
*:JZjz
+;K[k{
,<Ll|
-=M]m}
.>N^n~
/?O_o

Alternatívou je jednoducho vyhnúť sa prvým 32 znakom ASCII, ktoré sú definované ako riadiace znaky. Môže byť efektívnejšie kontrolovať ord(c) charakteru, c.


1 pre odpoveď č. 2
import string

columns = []
height = 10
whitespace_map = {
"t":   "TAB",
"n":   "LF",
"r":   "CR",
"x0b": "VT",
"x0c": "FF",
}

i = 0
j = height
while i < len(string.printable):
column = string.printable[i:j]
columns.append(column)
i += height
j += height

k = 0
while k < height:
for column in columns:
if k > len(column):
break
c = column[k]
if c in string.whitespace and c != " ":
c = whitespace_map[c]
# Alternative: c = " "
print("{: <5}".format(c), end="")
print()
k += 1

tlačí:

0    a    k    u    E    O    Y    )    =    {
1    b    l    v    F    P    Z    *    >    |
2    c    m    w    G    Q    !    +    ?    }
3    d    n    x    H    R    "    ,    @    ~
4    e    o    y    I    S    #    -    [
5    f    p    z    J    T    $    .        TAB
6    g    q    A    K    U    %    /    ]    LF
7    h    r    B    L    V    &    :    ^    CR
8    i    s    C    M    W    "    ;    _    VT
9    j    t    D    N    X    (    <    `    FF