Encoding python3中以字节而不是字符串形式显示的命令行参数

Encoding python3中以字节而不是字符串形式显示的命令行参数,encoding,python-3.x,filenames,command-line-arguments,Encoding,Python 3.x,Filenames,Command Line Arguments,我正在编写一个python3程序,它从命令行参数获取要处理的文件名。我对处理不同编码的正确方法感到困惑 我想我宁愿把文件名看作字节而不是字符串,因为这样避免了使用错误编码的危险。事实上,我的一些文件名使用了不正确的编码(当我的系统区域设置使用utf-8时为拉丁文1),但这并不妨碍像ls这样的工具工作。我希望我的工具也能适应这种情况 我有两个问题:命令行参数以字符串的形式提供给我(我使用argparse),我想以字符串的形式向用户报告错误 我已经成功地将代码修改为使用二进制文件,并且我的工具可以处

我正在编写一个python3程序,它从命令行参数获取要处理的文件名。我对处理不同编码的正确方法感到困惑

<>我想我宁愿把文件名看作字节而不是字符串,因为这样避免了使用错误编码的危险。事实上,我的一些文件名使用了不正确的编码(当我的系统区域设置使用utf-8时为拉丁文1),但这并不妨碍像ls这样的工具工作。我希望我的工具也能适应这种情况

我有两个问题:命令行参数以字符串的形式提供给我(我使用argparse),我想以字符串的形式向用户报告错误

我已经成功地将代码修改为使用二进制文件,并且我的工具可以处理在当前默认编码中名称无效的文件,只要通过文件系统递归即可,因为我很早就将参数转换为二进制文件,并且在调用fs函数时使用二进制文件。但是,当我收到一个无效的文件名参数时,它会作为带有奇怪字符的unicode字符串传递给我,如
\udce8
。我不知道这些是什么,尝试编码总是失败的,无论是utf8编码还是相应的(错误的)编码(这里是拉丁语1)

另一个问题是报告错误。我希望我的工具的用户解析我的标准输出(因此希望保留文件名),但当在标准输出上报告错误时,我宁愿用utf-8编码它,用适当的“无效/问号”字符替换无效序列

所以

1) 有没有更好、完全不同的方法?(是的,修复文件名是有计划的,但我仍然希望我的工具是健壮的)

2) 我如何获得原始二进制形式的命令行参数(我没有预先解码),知道对于无效序列,重新编码解码的参数将失败,以及

3) 我如何告诉utf-8编解码器用一些无效的标记替换无效的、不可编码的序列,而不是死在我身上

当我收到文件名参数时 这是无效的,但是,它是 作为unicode字符串和 奇怪的字符,如\udce8

这些是代理角色。低8位是原始无效字节


请参阅。

不要违反规则:文件名是字符串,而不是字节

当您应该使用
字符串时,不应该使用
字节
。字节是整数的元组。
字符串是字符的元组。它们是不同的概念。你所做的就像使用一个整数,而你应该使用一个布尔值

(旁白:Python将所有字符串存储在Unicode下的内存中;所有字符串的存储方式相同。编码指定Python如何将文件中的字节转换为这种内存格式。)


操作系统将文件名存储为特定编码下的字符串。我很惊讶你说有些文件名有不同的编码;据我所知,文件名编码是系统范围的。例如,
open
等函数默认为默认系统文件名编码。

好的,这解决了第2点。因此,正确的做法是在仅编码CLI参数时添加“代理场景”?或者使用代理工具将所有内容作为字符串处理?其他几点呢?至少我最担心的问题已经解决了,所以答案被接受了!Python3.1(而不是3.0)应该自动处理代理场景。我希望我的操作系统能将文件名视为字符串,但有很多事情表明情况并非如此。我尝试用不同的语言环境设置运行ls,但它仍然会给我相同的字节序列。如果区域设置与文件系统编码不同,则不会执行代码转换。我本来会在任何地方使用字符串(这是我最初做的),但它不起作用,现在我认为原因是我正在使用的一个lib(pyxattr)在处理代理时失败。