linux Python使用打印重定向将字节写入文件

twh00eeo  于 2023-02-11  发布在  Linux
关注(0)|答案(2)|浏览(199)

使用Perl,

$ perl -e 'print "\xca"' > out

现在是$ xxd out
我们有

00000000: ca

但对于巨蟒我尝试过

$ python3 -c 'print("\xca", end="")' > out
$ xxd out

我得到的是

00000000: c38a

我不知道发生了什么事。

wvmv3b1j

wvmv3b1j1#

在Python中,str对象是一系列的unicode代码点,如何将其打印到屏幕上取决于sys.stdout的编码,这是根据您的语言环境(或者可能有各种环境变量会影响它,但默认情况下,它是您的语言环境)选择的,因此您的语言环境必须设置为UTF-8,这也是我的默认设置:

(py311) Juans-MBP:~ juan$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=
(py311) Juans-MBP:~ juan$ python -c "print('\xca', end='')" | xxd
00000000: c38a

但是,如果我重写我的locale并告诉它使用en_US.ISO8859-1(latin-1),一种单字节编码,我们会得到您所期望的结果:

(py311) Juans-MBP:~ juan$ LC_ALL="en_US.ISO8859-1" python -c "print('\xca', end='')" | xxd
00000000: ca

如果你需要原始字节,解决方案是使用原始字节,在Python源代码中,方法是使用字节常量(或者字符串常量,然后.encode它),我们可以在sys.stdout.buffer使用原始缓冲区:

(py311) Juans-MBP:~ juan$ python -c "import sys; sys.stdout.buffer.write(b'\xca')" | xxd
00000000: ca

或者通过将字符串编码为bytes对象:

(py311) Juans-MBP:~ juan$ python -c "import sys; sys.stdout.buffer.write('\xca'.encode('latin'))" | xxd
00000000: ca
1l5u6lss

1l5u6lss2#

在python中\xca被解释为两字节字符串在UTF-8编码中,这就是为什么当一个值写入文件时,它会自动将文件中的两个字节存储为c3 8a
但是在perl中\xca被解释为一个十六进制值为0xca的单字节,因此当该值存储在文件中时,它将不编码保存。

You can check more details

相关问题