“é”来自哪个字符集? (Python:带“é”的文件名,如何使用 os.path.exists , filecmp.cmp, shutil.move?)

Posted

技术标签:

【中文标题】“é”来自哪个字符集? (Python:带“é”的文件名,如何使用 os.path.exists , filecmp.cmp, shutil.move?)【英文标题】:What character set is "é" from? (Python: Filename with "é", how to use os.path.exists , filecmp.cmp, shutil.move?) 【发布时间】:2020-08-27 16:35:39 【问题描述】:

é 来自什么字符集?在 Windows 记事本中,在 ANSI 文本文件中包含此字符可以很好地保存。插入类似???? 的东西,你会得到一个错误。 é 似乎在 Putty 的 ASCII 终端中运行良好(CP437 和 IBM437 是否相同?)而 ???? 则不然。

我可以看到???? 是 Unicode,而不是 ASCII。但是é 是什么?它不会给出我在记事本中使用 Unicode 时遇到的错误,但是在我按照Python NLTK: SyntaxError: Non-ASCII character '\xc3' in file (Sentiment Analysis -NLP) 的建议添加“魔术注释”之前,Python 抛出了SyntaxError: Non-ASCII character '\xc3' in file on line , but no encoding declared;

我添加了“魔术注释”并没有收到该错误,但 os.path.isfile() 表示带有 é 的文件名不存在。具有讽刺意味的是,é 中的字符 Marc-André Lemburg 是错误链接到的 PEP 的作者。

编辑:如果我打印文件的路径,带重音符号的 e 会显示为 ├⌐,但我可以将 é 复制并粘贴到命令提示符中。

EDIT2:见下文

Private    > cat scratch.py   ### LOL cat scratch :3
# coding=utf-8
file_name = r"Filéname"
file_name = unicode(file_name)
Private    > python scratch.py
Traceback (most recent call last):
  File "scratch.py", line 3, in <module>
    file_name = unicode(file_name)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)
Private    >

EDIT3:

Private    > PS1="Private    > " ; echo code below ; cat scratch.py ; echo =======  ; echo output below ; python scratch.py
code below
# -*- coding: utf-8 -*-

file_name = r"Filéname"
file_name = unicode(file_name, encoding="utf-8")

# I have code here to determine a path depending on the hostname of the
# machine, the folder paths contain no Unicode characters, for my debug
# version of the script, I will hardcode the redacted hostname.
hostname = "One"
if hostname == "One":
    folder = "C:/path/folder_one"
elif hostname == "Two":
    folder = "C:/path/folder_two"
else:
    folder = "C:/path/folder_three"

path = "%s/%s" % (folder, file_name)
path = unicode(path, encoding="utf-8")


print path
=======
output below
Traceback (most recent call last):
  File "scratch.py", line 18, in <module>
    path = unicode(path, encoding="utf-8")
TypeError: decoding Unicode is not supported
Private    >

【问题讨论】:

请专注于您所面临的实际问题。像这样很难找到你要问的问题。 我正在尝试检查文件是否存在(然后移动、删除或复制它)并且文件上带有重音 e。我试图解决这个问题,但也很好奇带重音的 e 是 ASCII、Unicode 还是其他。它似乎介于两者之间。就像一个“特殊”的 ASCII 字符。我想这是因为它用于拉丁字母,主要是法语,但也用于英语等。 this website 说它是 UNICODE。 @Johnny 不是一切吗?编码是否会影响它是否为 unicode?​​span> @Klaus 我可以通过关注实际问题来理解您的意思(我什至赞成您的评论)并且之前说过。但我也看到了更简单的问答。我正在尝试原始字符串,看看是否有帮助。也为我进一步阅读,***.com/questions/643694/… 【参考方案1】:

你需要告诉unicode这个字符串的编码是什么,这里是utf-8而不是ascii,文件头应该是# -*- coding: utf-8 -*-,Encoding Declarations

# -*- coding: utf-8 -*-
file_name = r"Filéname"
file_name = unicode(file_name, encoding="utf-8")
  1 Help on class unicode in module __builtin__:
  2
  3 class unicode(basestring)
  4  |  unicode(object='') -> unicode object
  5  |  unicode(string[, encoding[, errors]]) -> unicode object
  6  |
  7  |  Create a new Unicode object from the given encoded string.
  8  |  encoding defaults to the current default string encoding.
  9  |  errors can be 'strict', 'replace' or 'ignore' and defaults to 'strict'.

正如我在之前的评论中提到的,通过切换到 Python 3,您可以省去很多麻烦。在带有 unicode 字符的 Windows 文件系统上运行 Python 2 可能是一场噩梦。

【讨论】:

谢谢,安德鲁。您似乎在向我指出正确的方向,当我在 python 脚本中打印 file_name 时,它​​显示 é 而不是 ├⌐ 但在定义文件的完整路径时出现新的 TypeError: decoding Unicode is not supported 错误(请参阅编辑3). 我读过同时学习 Python 2 和 Python 3 只会造成更多的困惑。但也许从那时起我已经学会了足够多的 Python2 来继续学习 Python3(六个会有所帮助)。我注意到现代 Linux 发行版中不包含 Python2,只有 Python3 包含。所以我在我的一台机器上安装了 Python3(我的 Python2 脚本的关联搞砸了,是否有 Python3 文件的替代扩展来区分?) 若要控制从资源管理器打开 python 文件时使用的版本,请将 python 文件中的第一行设置为 #! python2 用于 python 2,#! python3 用于 python3。 documentation Windows 上 Python 2 中的默认编码不是utf-8,因此path = "%s/%s" % (folder, file_name) 行上的file_name 使用windows-1252 解码。这将工作path = "%s/%s" % (folder, file_name.encode("utf-8"))

以上是关于“é”来自哪个字符集? (Python:带“é”的文件名,如何使用 os.path.exists , filecmp.cmp, shutil.move?)的主要内容,如果未能解决你的问题,请参考以下文章

XMLéè | 气场全开,解锁你的女王灵魂

在 Python 中的字符串中的特定单词之间插入逗号

Python 请求编码 POST 数据

将重音字符 é 插入 Symfony2 中的表单时,如何在 mysql 数据库中将重音字符 é 保存为 é?

带有 é 等特殊字符的 json

python列表和字典