Python论坛  - 讨论区

标题:Re: [python-chinese] 带空格的路径应该怎么引用?

2005年11月04日 星期五 09:57

Du Jun jdu at haiercct.com.cn
Fri Nov 4 09:57:54 HKT 2005

张骏 wrote:
> 在 2005-11-03 17:44:35,Qiangning Hong <hongqn at gmail.com> 写道:
各位,把现在的源码贴上来,在罗嗦几句:

#-*- coding:utf-8 -*- 
import os,time
iWorkDir=os.path.normpath('D:\Documents and Settings\Arui\桌面\工作夹')
iDirList=os.listdir(iWorkDir)
iFolderName='-'.join(time.ctime().split()[:3])

if(iFolderName in iDirList):
	pass
else:
	iNewFolder=os.path.join(iWorkDir,iFolderName)
	os.mkdir(iNewFolder)
	
这个在windows下可以运行。
1,现在的文件编码是gb2312,请问这个编码跟cp936有什么不同,各自都有什么作用?
2,关于coding行,我的理解是这样:
	在python编译器读入源码的时候,源码中若有常量字符串,则在编译时会用coding	行指定的编码来读取,处理,否则,用系统默认的编码来读取。也就是说,无论我	在源码中使用
	os.path.normpath('D:\Documents and Settings\Arui\桌面\工作夹')
	还是
	os.path.normpath(u'D:\Documents and Settings\Arui\桌面\工作夹')
	python编译器读取源文件时都会用coding行指定的编码来读取,
	不知道这样理解正确否?


>>Du Jun wrote:
>>>在文件头加入
>>>#-*- coding:utf-8 -*- 
>>>保存为 cp936,运行ok!
>>
>>文件头指定的编码应和文件实际编码一致。你这里运行ok其实是你运气好,正好你
>>的cp936的中文用utf-8编码也能解释。
> 
> 其实结果正确也不能算运气好。
> 
> coding: utf-8这种指定只对unicode常量字符串有效,对于str,还是以存放时的编码处理。
> 因此,路径实际被normpath处理的时候还是gbk的编码。
> 
> 也就是说如果
> iWorkDir=os.path.normpath(u'D:\Documents and Settings\Arui\桌面\工作夹')
> 这样写,coding设定才起作用。
> 
> 但是这样写的结果是脚本根本无法执行,因为python在编译这个字符串的时候,utf8无法成功转换。

[发文请剪裁引文,谢谢]

coding行不仅仅在创建unicode常量时才使用,它还在python编译器读入源代码的
时候使用。python编译器读入源文件后,首先要先把源文件内容转成unicode再转
成UTF-8字节流,然后再进行语法分析。这一切都发生在编译代码之前。

你可以尝试一下把下面的代码用utf8保存为test.py:

# coding: cp936
a = "桌"

然后运行它。这段代码中没有unicode常量,但是却会segmentation fault,至少
在我这里是这样。

-- 
Qiangning Hong, Registered Linux User #396996
My Blog: http://www.hn.org/hongqn
RSS: http://feeds.feedburner.com/hongqn

_______________________________________________
python-chinese list
python-chinese at lists.python.cn
http://python.cn/mailman/listinfo/python-chinese

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月04日 星期五 10:45

张骏 zhangj at foreseen-info.com
Fri Nov 4 10:45:40 HKT 2005

在 2005-11-04 09:57:54,"Du Jun" <jdu at haiercct.com.cn> 写道:
> 各位,把现在的源码贴上来,在罗嗦几句:
> 
> #-*- coding:utf-8 -*- 
> import os,time
> iWorkDir=os.path.normpath('D:\Documents and Settings\Arui\桌面\工作夹')
> iDirList=os.listdir(iWorkDir)
> iFolderName='-'.join(time.ctime().split()[:3])
> 
> if(iFolderName in iDirList):
> 	pass
> else:
> 	iNewFolder=os.path.join(iWorkDir,iFolderName)
> 	os.mkdir(iNewFolder)
> 	
> 这个在windows下可以运行。
> 1,现在的文件编码是gb2312,请问这个编码跟cp936有什么不同,各自都有什么作用?
  gbk , gb2312 , cp936 ,gb18030 都对应汉字编码,他们的区别只是含有汉字的个数(容量),
  对于同一个汉字,他们对应的编码是一致的。
  我比较喜欢使用gbk

> 2,关于coding行,我的理解是这样:
> 	在python编译器读入源码的时候,源码中若有常量字符串,则在编译时会用coding
> 	行指定的编码来读取,处理,否则,用系统默认的编码来读取。也就是说,无论我
> 	在源码中使用
> 	os.path.normpath('D:\Documents and Settings\Arui\桌面\工作夹')
> 	还是
> 	os.path.normpath(u'D:\Documents and Settings\Arui\桌面\工作夹')
> 	python编译器读取源文件时都会用coding行指定的编码来读取,
> 	不知道这样理解正确否?
   暂时还没讨论出结果。不过我的意见倾向于只对unicode常量处理。

-- 
张骏 <zhangj at foreseen-info.com>

敏捷来自Python
简单源于我们
丰元信信息技术有限公司



[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月04日 星期五 11:24

limodou limodou at gmail.com
Fri Nov 4 11:24:23 HKT 2005

> > 2,关于coding行,我的理解是这样:
> >       在python编译器读入源码的时候,源码中若有常量字符串,则在编译时会用coding
> >       行指定的编码来读取,处理,否则,用系统默认的编码来读取。也就是说,无论我
> >       在源码中使用
> >       os.path.normpath('D:\Documents and Settings\Arui\桌面\工作夹')
> >       还是
> >       os.path.normpath(u'D:\Documents and Settings\Arui\桌面\工作夹')
> >       python编译器读取源文件时都会用coding行指定的编码来读取,
> >       不知道这样理解正确否?
>    暂时还没讨论出结果。不过我的意见倾向于只对unicode常量处理。

我的理解是这样的。

--
I like python!
My Donews Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2005年11月04日 星期五 11:50

Qiangning Hong hongqn at gmail.com
Fri Nov 4 11:50:21 HKT 2005

Du Jun wrote:
> 各位,把现在的源码贴上来,在罗嗦几句:
> 
> #-*- coding:utf-8 -*- 
> import os,time
> iWorkDir=os.path.normpath('D:\Documents and Settings\Arui\桌面\工作夹')

再提醒一遍,用os.path.normpath的时候路径分隔符应该用正斜杠(/),不要用反
斜杠(\),不然os.path.normpath不起作用,你还会遇到问题(比如反斜杠后面的
字符是't'时)

[...略...]

> 这个在windows下可以运行。
> 1,现在的文件编码是gb2312,请问这个编码跟cp936有什么不同,各自都有什么作用?

gb2312和cp936是一样的,只不过一个国家标准,一个微软定义的代码页。

> 2,关于coding行,我的理解是这样:
> 	在python编译器读入源码的时候,源码中若有常量字符串,则在编译时会用coding	行指定的编码来读取,处理,否则,用系统默认的编码来读取。也就是说,无论我	在源码中使用
> 	os.path.normpath('D:\Documents and Settings\Arui\桌面\工作夹')
> 	还是
> 	os.path.normpath(u'D:\Documents and Settings\Arui\桌面\工作夹')
> 	python编译器读取源文件时都会用coding行指定的编码来读取,
> 	不知道这样理解正确否?

不正确。在读入源码的时候,不管有没有常量字符串,都会用coding行指定的编码
来读取。如果没有coding行,就用iso-8859-1读取,在这种情况下如果源代码中有
不在ASCII字符集中的字符,则输出DeprecationWarning信息。

从u字符串生成unicode常量是编译阶段的事。

-- 
Qiangning Hong, Registered Linux User #396996
My Blog: http://www.hn.org/hongqn
RSS: http://feeds.feedburner.com/hongqn


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号