为什么Python2和Python3以不同的方式对待相同的Windows目录?

时间:2015-11-26 11:55:46

标签: python python-2.7 python-3.x unicode

我的Windows语言是中文。 为了说明我的观点,我使用了包pathlib

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

Python2.7我得到False

Python3我得到True

有什么想法吗?感谢您的任何建议。

对于Python2.7,您可以使用" pip install pathlib"

安装pathlib

3 个答案:

答案 0 :(得分:1)

在Python 3中,字符串默认为Unicode。在Python 2中,它们是以源文件编码编码的字节字符串。在Python 2中使用Unicode字符串。

还要确保声明源文件编码并确保源以该编码保存。

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

答案 1 :(得分:0)

Python 2和Python 3之间的主要区别在于处理文本和字节的基本类型。在Python 3上,我们有一种文本类型:str,它包含Unicode数据和两种字节类型bytesbytearray

另一方面,在Python 2上,我们有两种文本类型:str,对于所有意图和目的,仅限于ASCII + 7位范围以上的一些未定义数据,unicode等同于Python 3 { {1}}类型和从Python 3继承的一个字节类型str

Python 3删除了所有不会从字节转到Unicode的编解码器,反之亦然,删除了现在无用的bytearray方法和字符串.encode()方法。

更多关于此事here

答案 2 :(得分:0)

对Windows路径使用Unicode文字:在顶部添加r'D:\新建文件夹'

解释

  1. # -*- coding: utf-8 -*-是Python 2上的字节串。它的特定值取决于顶部的编码声明(例如r'D:\新建文件夹')。如果在Python 2中使用非ascii文字,则应该在没有声明的情况下得到错误。{{1}}是Python 3上的Unicode字符串,默认源代码编码是utf-8(不需要编码声明)
  2. 如果输入是Unicode和" ANSI"则在使用Windows上的文件时,Python使用Unicode API。如果输入是字节,则为API。
  3. 如果源代码编码不同于" ANSI"编码(如cp1252)则结果可能不同:字节按原样传递(相同的字节序列可以表示不同编码中的不同字符)。如果文件名不能用" ANSI"表示。编码(例如,cp1252 - 单字节编码不能代表所有Unicode字符 - 大约有一百万个Unicode字符,但只有256个字节);结果可能不同。在Windows上使用Unicode字符串作为文件名修复了这两个问题。