gpt4 book ai didi

windows - python 输出到 Windows 控制台的意外空行

转载 作者:可可西里 更新时间:2023-11-01 10:44:01 28 4
gpt4 key购买 nike

我有一个打印目录结构的小程序。它工作正常,除非目录名称包含德语变音字符。在这种情况下,int 在目录行之后打印一个空行。

我在 Windows 7 64 位上运行 Python 3.50。

这段代码...

class dm():
...
def print(self, rootdir=None, depth=0):

if rootdir is None:
rootdir = self.initialdir

if rootdir in self.dirtree:
print('{}{} ({} files)'.format(' '*depth,
rootdir,
len(self.dirtree[rootdir]['files'])))
for _dir in self.dirtree[rootdir]['dirs']:
self.print(os.path.join(rootdir, _dir), depth+1)
else:
pass

...产生以下输出:

B:\scratch (11 files)
B:\scratch\Test1 (3 files)
B:\scratch\Test1 - Kopie (0 files)
B:\scratch\Test1 - Übel (0 files)

B:\scratch\Test2 (3 files)
B:\scratch\Test2\Test21 (0 files)

代码页设置为 65001 时也是如此。如果我将代码页更改为例如850 然后空白行消失,当然“Ü”没有正确打印。

结构 self.dirtree 是列表字典的字典,用 os.walk 解析,看起来没问题。

Python 还是 Windows?有什么建议吗?
马文

最佳答案

使用代码页 65001 (UTF-8) 时有几个错误——所有这些都是由于 Windows 控制台(即 conhost.exe),而不是 Python。最好的解决方案是避免这个有问题的代码页,而是使用宽字符 API,例如加载 win_unicode_console。 .

您遇到了一个错误,该错误存在于 Windows 10 之前使用的旧版控制台中。(如果您选择“使用旧版控制台”选项,它在 Windows 10 中仍然可用。)控制台解码 UTF-8 缓冲区到 UTF-16 并报告它写入 b'\xc3\x9c'(即 "Ü" 编码为 UTF-8)作为一个字符,但它应该报告它写入的字节数,即两个。 Python 的缓冲 sys.stdout 发现显然有一个字节未写入,因此它尽职尽责地再次写入该行的最后一个字节,即 b'\n'。这就是为什么你得到一个额外的换行符。如果写入的缓冲区包含许多非 ASCII 字符,尤其是 U+07FF 以上的代码被编码为三个 UTF-8 字节,结果可能会更糟。


如果您尝试将 "Ü" 粘贴到交互式 REPL 中,则会出现更严重的错误。这个错误甚至在 Windows 10 中仍然存在。在这种情况下,进程正在读取编码为 UTF-8 的控制台的宽字符 (UTF-16) 输入缓冲区。控制台通过 WideCharToMultiByte 使用缓冲区进行转换,该缓冲区假定一个 Unicode 字符是目标代码页中的单个字节。但这对于 UTF-8 来说是完全错误的,其中一个 UTF-16 代码可能映射到多达三个字节。在这种情况下,它是两个字节,控制台只在翻译缓冲区中分配一个字节。所以 WideCharToMultiByte 失败了,但是控制台会尝试增加翻译缓冲区的大小吗?不,它会失败吗?不,它实际上返回它“成功”读取了 0 个字节。对于发出 EOF(文件末尾)信号的 Python REPL,解释器就像您在提示符下输入 Ctrl+Z 一样退出。

关于windows - python 输出到 Windows 控制台的意外空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35203799/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com