精华内容
下载资源
问答
  • 主要介绍了Python打印不合法的文件名,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下的相关资料
  • 打印不合法的文件名

    2019-07-25 20:28:24
    本文摘自《python3-cookbook》(5.15 打印不合法的文件名) 问题 你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃, 出现了 UnicodeEncodeError 异常和一条奇怪的消息—— surrogates ...

    本文摘自《python3-cookbook》(5.15 打印不合法的文件名)

    问题

    你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃, 出现了 UnicodeEncodeError 异常和一条奇怪的消息—— surrogates not allowed

    解决方案

    当打印未知的文件名时,使用下面的方法可以避免这样的错误:

    def bad_filename(filename):
        return repr(filename)[1:-1]
    
    try:
        print(filename)
    except UnicodeEncodeError:
        print(bad_filename(filename))
    

    讨论

    这一小节讨论的是在编写必须处理文件系统的程序时一个不太常见但又很棘手的问题。 默认情况下,Python假定所有文件名都已经根据 sys.getfilesystemencoding() 的值编码过了。 但是,有一些文件系统并没有强制要求这样做,因此允许创建文件名没有正确编码的文件。 这种情况不太常见,但是总会有些用户冒险这样做或者是无意之中这样做了( 可能是在一个有缺陷的代码中给 open() 函数传递了一个不合规范的文件名)。

    当执行类似 os.listdir() 这样的函数时,这些不合规范的文件名就会让Python陷入困境。 一方面,它不能仅仅只是丢弃这些不合格的名字。而另一方面,它又不能将这些文件名转换为正确的文本字符串。 Python对这个问题的解决方案是从文件名中获取未解码的字节值比如 \xhh 并将它映射成Unicode字符 \udchh 表示的所谓的”代理编码”。 下面一个例子演示了当一个不合格目录列表中含有一个文件名为bäd.txt(使用Latin-1而不是UTF-8编码)时的样子:

    import os
    files = os.listdir('.')
    print(files)    # ['spam.py', 'b\udce4d.txt', 'foo.txt']
    

    如果你有代码需要操作文件名或者将文件名传递给 open() 这样的函数,一切都能正常工作。 只有当你想要输出文件名时才会碰到些麻烦(比如打印输出到屏幕或日志文件等)。 特别的,当你想打印上面的文件名列表时,你的程序就会崩溃:

    for name in files:
         print(name)
    --------
    spam.py
    Traceback (most recent call last):
        File "<stdin>", line 2, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce4' in
    position 1: surrogates not allowed
    

    程序崩溃的原因就是字符 \udce4 是一个非法的Unicode字符。 它其实是一个被称为代理字符对的双字符组合的后半部分。 由于缺少了前半部分,因此它是个非法的Unicode。 所以,唯一能成功输出的方法就是当遇到不合法文件名时采取相应的补救措施。 比如可以将上述代码修改如下:

    for name in files:
        try:
            print(name)
        except UnicodeEncodeError:
            print(bad_filename(name))
    --------
    spam.py
    b\udce4d.txt
    foo.txt
    

    在 bad_filename() 函数中怎样处置取决于你自己。 另外一个选择就是通过某种方式重新编码,示例如下:

    def bad_filename(filename):
        temp = filename.encode(sys.getfilesystemencoding(), errors='surrogateescape')
        return temp.decode('latin-1')
    

    译者注:
    surrogateescape:
    这种是Python在绝大部分面向OS的API中所使用的错误处理器,
    它能以一种优雅的方式处理由操作系统提供的数据的编码问题。
    在解码出错时会将出错字节存储到一个很少被使用到的Unicode编码范围内。
    在编码时将那些隐藏值又还原回原先解码失败的字节序列。
    它不仅对于OS API非常有用,也能很容易的处理其他情况下的编码错误。
    使用这个版本产生的输出如下:

    for name in files:
         try:
             print(name)
         except UnicodeEncodeError:
             print(bad_filename(name))
    --------
    spam.py
    bäd.txt
    foo.txt
    

    这一小节主题可能会被大部分读者所忽略。但是如果你在编写依赖文件名和文件系统的关键任务程序时, 就必须得考虑到这个。否则你可能会在某个周末被叫到办公室去调试一些令人费解的错误。
    本文链接:时光不写博客-打印不合法的文件名

    展开全文
  • python打印不合法的文件名 问题 你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃, 出现了 UnicodeEncodeError 异常和一条奇怪的消息—— surrogates not allowed 。 解决方案 当...

    python打印不合法的文件名

    问题
    你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃, 出现了 UnicodeEncodeError 异常和一条奇怪的消息—— surrogates not allowed 。

    解决方案
    当打印未知的文件名时,使用下面的方法可以避免这样的错误:
    在这里插入图片描述
    讨论
    这一小节讨论的是在编写必须处理文件系统的程序时一个不太常见但又很棘手的问题。 默认情况下,Python假定所有文件名都已经根据 sys.getfilesystemencoding() 的值编码过了。 但是,有一些文件系统并没有强制要求这样做,因此允许创建文件名没有正确编码的文件。 这种情况不太常见,但是总会有些用户冒险这样做或者是无意之中这样做了( 可能是在一个有缺陷的代码中给 open() 函数传递了一个不合规范的文件名)。

    当执行类似 os.listdir() 这样的函数时,这些不合规范的文件名就会让Python陷入困境。 一方面,它不能仅仅只是丢弃这些不合格的名字。而另一方面,它又不能将这些文件名转换为正确的文本字符串。 Python对这个问题的解决方案是从文件名中获取未解码的字节值比如 \xhh 并将它映射成Unicode字符 \udchh 表示的所谓的”代理编码”。 下面一个例子演示了当一个不合格目录列表中含有一个文件名为bäd.txt(使用Latin-1而不是UTF-8编码)时的样子:
    在这里插入图片描述
    如果你有代码需要操作文件名或者将文件名传递给 open() 这样的函数,一切都能正常工作。 只有当你想要输出文件名时才会碰到些麻烦(比如打印输出到屏幕或日志文件等)。 特别的,当你想打印上面的文件名列表时,你的程序就会崩溃:
    在这里插入图片描述
    程序崩溃的原因就是字符 \udce4 是一个非法的Unicode字符。 它其实是一个被称为代理字符对的双字符组合的后半部分。 由于缺少了前半部分,因此它是个非法的Unicode。 所以,唯一能成功输出的方法就是当遇到不合法文件名时采取相应的补救措施。 比如可以将上述代码修改如下:
    在这里插入图片描述
    在 bad_filename() 函数中怎样处置取决于你自己。 另外一个选择就是通过某种方式重新编码,示例如下:
    在这里插入图片描述
    译者注:

    surrogateescape:
    这种是Python在绝大部分面向OS的API中所使用的错误处理器,
    它能以一种优雅的方式处理由操作系统提供的数据的编码问题。
    在解码出错时会将出错字节存储到一个很少被使用到的Unicode编码范围内。
    在编码时将那些隐藏值又还原回原先解码失败的字节序列。
    它不仅对于OS API非常有用,也能很容易的处理其他情况下的编码错误。
    使用这个版本产生的输出如下:
    在这里插入图片描述
    这一小节主题可能会被大部分读者所忽略。但是如果你在编写依赖文件名和文件系统的关键任务程序时, 就必须得考虑到这个。否则你可能会在某个周末被叫到办公室去调试一些令人费解的错误。

    展开全文
  • 打印不合法的文件名 问题 你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃,出现了 UnicodeEncodeError 异常和一条奇怪的消息—— surrogates not allowed 。 解法 当打印未知的...

    打印不合法的文件名

    问题

    你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃,出现了 UnicodeEncodeError 异常和一条奇怪的消息—— surrogates not allowed 。

    解法

    当打印未知的文件名时,使用下面的方法可以避免这样的错误:

    def bad_filename(filename):
    	return repr(filename)[1:-1]
    
    try:
    	print(filename)
    except UnicodeEncodeError:
    	print(bad_filename(filename))
    

    讨论

    这一小节讨论的是在编写必须处理文件系统的程序时一个不太常见但又很棘手的问题。默认情况下,Python假定所有文件名都已经根据sys.getfilesystemencoding()的值编码过了。但是,有一些文件系统并没有强制要求这样做,因此允许创建文件名没有正确编码的文件。这种情况不太常见,但是总会有些用户冒险这样做或者是无意之中这样做了(可能是在一个有缺陷的代码中给open()函数传递了一个不合规范的文件名)。

    当执行类似os.listdir()这样的函数时,这些不合规范的文件名就会让Python陷入困境。一方面,它不能仅仅只是丢弃这些不合格的名字。而另一方面,它又不能将这些文件名转换为正确的文本字符串。Python对这个问题的解决方案是从文件名中获取未解码的字节值比如\xhh并将它映射成Unicode字符\udchh表示的所谓的“代理编码”。下面一个例子演示了当一个不合格目录列表中含有一个文件名为 bäd.txt(使用Latin-1而不是UTF-8编码)时的样子:

    >>> import os
    >>> files = os.listdir('.')
    >>> files
    ['spam.py', 'b\udce4d.txt', 'foo.txt']
    >>>
    

    如果你有代码需要操作文件名或者将文件名传递给 open() 这样的函数,一切都能正常工作。只有当你想要输出文件名时才会碰到些麻烦 (比如打印输出到屏幕或日志文件等)。特别的,当你想打印上面的文件名列表时,你的程序就会崩溃:

    >>> for name in files:
    ... 	print(name)
    ...
    spam.py
    Traceback (most recent call last):
    	File "<stdin>", line 2, in <module>
    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce4' in
    position 1: surrogates not allowed
    >>>
    

    程序崩溃的原因就是字符 nudce4 是一个非法的 Unicode 字符。它其实是一个被称为代理字符对的双字符组合的后半部分。由于缺少了前半部分,因此它是个非法的Unicode。所以,唯一能成功输出的方法就是当遇到不合法文件名时采取相应的补救措施。比如可以将上述代码修改如下:

    >>> for name in files:
    ... try:
    ... 	print(name)
    ... except UnicodeEncodeError:
    ... 	print(bad_filename(name))
    ...
    spam.py
    b\udce4d.txt
    foo.txt
    >>>
    

    在 bad_filename() 函数中怎样处置取决于你自己。另外一个选择就是通过某种方式重新编码,示例如下:

    def bad_filename(filename):
    	temp = filename.encode(sys.getfilesystemencoding(), errors='surrogateescape')
    	return temp.decode('latin-1')
    

    surrogateescape:这种是 Python 在绝大部分面向 OS 的 API 中所使用的错误处理器,它能以一种优雅的方式处理由操作系统提供的数据的编码问题。在解码出错时会将出错字节存储到一个很少被使用到的 Unicode 编码范围内。在编码时将那些隐藏值又还原回原先解码失败的字节序列。它不仅对于 OS API 非常有用,也能很容易的处理其他情况下的编码错误。

    使用这个版本产生的输出如下:

    >>> for name in files:
    ... 	try:
    ... 		print(name)
    ... 	except UnicodeEncodeError:
    ... 		print(bad_filename(name))
    ...
    spam.py
    bäd.txt
    foo.txt
    >>>
    

    这一小节主题可能会被大部分读者所忽略。但是如果你在编写依赖文件名和文件系统的关键任务程序时,就必须得考虑到这个。否则你可能会在某个周末被叫到办公室去调试一些令人费解的错误。

    展开全文
  • 问题你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名...解决方案当打印未知的文件名时,使用下面的方法可以避免这样的错误:def bad_filename(filename):return repr(filename)[1:-1]try:print(fi...

    问题

    你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名的时候程序崩溃, 出现了 UnicodeEncodeError 异常和一条奇怪的消息—— surrogates not allowed 。

    解决方案

    当打印未知的文件名时,使用下面的方法可以避免这样的错误:

    def bad_filename(filename):

    return repr(filename)[1:-1]

    try:

    print(filename)

    except UnicodeEncodeError:

    print(bad_filename(filename))

    如果你有代码需要操作文件名或者将文件名传递给 open() 这样的函数,一切都能正常工作。 只有当你想要输出文件名时才会碰到些麻烦(比如打印输出到屏幕或日志文件等)。 特别的,当你想打印上面的文件名列表时,你的程序就会崩溃:

    >>> for name in files:

    ... print(name)

    ...

    spam.py

    Traceback (most recent call last):

    File "", line 2, in

    UnicodeEncodeError: 'utf-8' codec can't encode character '\udce4' in

    position 1: surrogates not allowed

    >>>

    >>> for name in files:

    ... try:

    ... print(name)

    ... except UnicodeEncodeError:

    ... print(bad_filename(name))

    ...

    spam.py

    b\udce4d.txt

    foo.txt

    >>>

    在 bad_filename() 函数中怎样处置取决于你自己。 另外一个选择就是通过某种方式重新编码,示例如下:

    def bad_filename(filename):

    temp = filename.encode(sys.getfilesystemencoding(), errors='surrogateescape')

    return temp.decode('latin-1')

    译者注:

    surrogateescape:

    这种是Python在绝大部分面向OS的API中所使用的错误处理器,

    它能以一种优雅的方式处理由操作系统提供的数据的编码问题。

    在解码出错时会将出错字节存储到一个很少被使用到的Unicode编码范围内。

    在编码时将那些隐藏值又还原回原先解码失败的字节序列。

    它不仅对于OS API非常有用,也能很容易的处理其他情况下的编码错误。

    使用这个版本产生的输出如下:

    >>> for name in files:

    ... try:

    ... print(name)

    ... except UnicodeEncodeError:

    ... print(bad_filename(name))

    ...

    spam.py

    bäd.txt

    foo.txt

    >>>

    这一小节主题可能会被大部分读者所忽略。但是如果你在编写依赖文件名和文件系统的关键任务程序时, 就必须得考虑到这个。否则你可能会在某个周末被叫到办公室去调试一些令人费解的错误。

    以上就是Python打印不合法的文件名的详细内容,更多关于Python 打印文件名的资料请关注python博客其它相关文章!

    展开全文
  • 问题你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名...解决方案当打印未知的文件名时,使用下面的方法可以避免这样的错误:def bad_filename(filename):return repr(filename)[1:-1]try:print(fi...
  • C#快速剔除字符串中不合法的文件名 stringstrFileName="文件名称"; StringBuilder rBuilder =newStringBuilder(strFileName);foreach(charrInvalidCharinPath.GetInvalidFileNameChars()) rBuilder.Replace...
  • 问题你的程序获取了一个目录中的文件名列表,但是当它试着去打印文件名...解决方案当打印未知的文件名时,使用下面的方法可以避免这样的错误:def bad_filename(filename):return repr(filename)[1:-1]try:print(fi...
  • /// 过滤不合法的文件名字符 /// </summary> /// <param name="name"></param> /// <returns></returns> public static string FilterInvalidFileNameChars(string name) { ...
  • 上传文件时候,我们很头疼对文件中文命名,一个字符串经常不合法导致文件存储不上,该方法经过多次改造,分享给各位。该文件位于: 开源驰骋工作流bp框架里面。 public static void WriteFile(string file, ...
  • 文件名的命名规则:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp按照这个规则,有人写了一个函数:http://www.codeproject.com/file/isvalidfilename.aspMS为什么...
  • 在上传文件时候,我们很头疼对文件中文命名,一个字符串经常不合法导致文件存储不上,该方法经过多次改造,分享给各位。 该文件位于: 开源驰骋工作流bp框架里面. 源代码 /// <summary> /// ...
  • 文件名不合法, 无法发送! (file:///home/usr/xxxx/xyz.png) 看文档里说用URI格式, 我是这么写: [CQ:image,file=file:///home/usr/xxxx/xyz.png] os.path.exists('/home/usr/xxxx/xyz.png')返回是...
  • 对正则不是很熟,网上搜都是判断文件名是否异常正则 strName=strName.replace("正则", "");
  • 去掉文件名的不合法字符

    千次阅读 2012-05-04 16:16:37
    QString QPath::removeInvalidChar(const QString& strFileName) { QString strName = strFileName; return strName.replace(QRegExp("[/*?:|\"\\\\]"), "").trimmed(); }
  • 那么一个合法的文件(Win下)应该符合如下规则:1.文件名不能为空,空在这里有两个意思:文件名(包括扩展名)长度为0或仅由空字符组成(包括\t\b等可见的转义字符)文件名和扩展名能同时为空.但实际上我们可以用程...
  • // pathorfilename:绝对路径的文件名或目录名。 // bisfilename:说明pathorfilename... 2)pathorfilename参数不是合法的文件名或目录名;3)磁盘空间不足。 bool MKDIR(const char *filename,bool bisfilename) { /
  • 那么一个合法的文件(Win下)应该符合如下规则:1.文件名不能为空,空在这里有两个意思:文件名(包括扩展名)长度为0或仅由空字符组成(包括\t\b等可见的转义字符)文件名和扩展名能同时为空.但实际上我们可以用程...
  • Linux 文件名合法性检测

    千次阅读 2018-10-08 16:29:54
    文件名长度超过255 避免使用加号、减号或者&quot;.&quot;作为普通文件第一个字符 文件名避免使用下列特殊字符,包括制表符和退格符 Python 示例如下: #!/usr/bin/env python # -*- coding:utf-8 -*- ...
  • 检查文件名是否合法

    2015-08-14 16:40:00
    在网上找了各种方法,都没有很好方法。于是自己写了一个,原理其实很简单 文件名不能包含下列任意字符: ... ''' 判断文件名是否合法 ''' </summary> ''' <param name="fileName">文件名包...
  • <div><p>我知道这边已经...文件名不合法 无法发送" 或者"图片(缓存)不存在"无法发送 最后作者说救不了我,我才来这边打扰</p><p>该提问来源于开源项目:richardchien/coolq-http-api</p></div>
  • {=================================================== 功 能 : 检查文件路径和文件名是否...返 回 值 : True : 合法 | False : 不合法   备 注 : 仅检查是否合法,不检测文件是否存在   作 者 :...
  • Java中用到文件操作时,... 那么一个合法的文件(Win下)应该符合如下规则: 1.文件名不能为空,空在这里有两个意思: 文件名(包括扩展名)长度为0或仅由空字符组成(包括\t\b等可见的转义字符) 文件名和扩展名能...
  • 在开发“518抽奖软件”的时候,需要将每个奖项的结果保存为文件,需要检查奖项名是否是合法的文件名。 传统的检查几个非法字符的方法不够全面,所以写了一个认为比较全面的代码,源码如下。 检查文件名是否合法有效...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 512
精华内容 204
关键字:

不合法的文件名