为什么Python2和Python3对同一个windows目录的处理方式不同?

2024-03-29 14:54:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我的windows语言是中文。 为了说明我的观点,我使用包pathlib。你知道吗

from pathlib import *
rootdir=Path(r'D:\新建文件夹')
print(rootdir.exists())

Python2.7我得到了False

Python3我得到了True

有什么想法吗?谢谢你的建议。你知道吗

对于Python2.7,可以使用“pip install pathlib”安装pathlib


Tags: pathfromimport文件夹语言falsetruewindows
2条回答

python2和python3之间的主要区别在于处理文本和字节的基本类型。在python3上,我们有一个文本类型:str,它保存Unicode数据和两个字节类型bytesbytearray。你知道吗

另一方面,在Python2上,我们有两种文本类型:str,无论出于何种目的,它都被限制为ASCII+7位范围以上的一些未定义数据,unicode相当于Python3str类型和它从Python3继承的单字节类型bytearray。你知道吗

python3删除了所有不能从字节转换为Unicode的编解码器,反之亦然,并删除了字节上现在无用的.encode()方法和字符串上的.decode()方法。你知道吗

更多信息,例如here。你知道吗

在Python中,3个字符串默认为Unicode。在python2中,它们是在源文件编码中编码的字节字符串。在python2中使用Unicode字符串。你知道吗

还要确保声明源文件编码,并确保源文件保存在该编码中。你知道吗

#coding:utf8
from pathlib import *
rootdir=Path(ur'D:\新建文件夹')
print(rootdir.exists())

对Windows路径使用Unicode文本:在顶部添加from __future__ import unicode_literals。你知道吗

说明

  1. r'D:\新建文件夹'是python2上的bytestring。它的具体值取决于顶部的编码声明(例如# -*- coding: utf-8 -*-)。如果在python2中使用非ascii文本,则应该得到一个没有声明的错误。r'D:\新建文件夹'是python3上的Unicode字符串,默认的源代码编码是utf-8(不需要编码声明)
  2. 如果输入是Unicode,Python在Windows上处理文件时使用Unicode API,如果输入是bytes,则使用“ANSI”API。你知道吗

如果源代码编码不同于“ANSI”编码(例如cp1252),那么结果可能不同:字节按原样传递(相同的字节序列可以在不同的编码中表示不同的字符)。如果文件名不能用“ANSI”编码表示(例如,cp1252 a单字节编码不能表示所有Unicode字符,大约有一百万个Unicode字符,但只有256个字节);结果可能会有所不同。在Windows上对文件名使用Unicode字符串可以解决这两个问题。你知道吗

相关问题 更多 >