python脚本替换文件名中的非法字母

Windows环境下,文件命名时,有些字符是不允许的。本文的脚本就是把一个文件名中的非法字符替换成某个指定字符。

背景

在用python脚本自动保存blog页面备份的时候,发现有个错误:

Traceback (most recent call last):
  File "e:\personal\export_blogs\export_blog.py", line 122, in <module>
    export_csdn_blogs(user_name, blog_saved_path, sleep_len)
  File "e:\personal\export_blogs\export_blog.py", line 102, in export_csdn_blogs
    web_utils.save_page(article.url, os.path.join(blog_saved_path, article.title + ".htm"))
  File "e:\personal\export_blogs\web_utils.py", line 36, in save_page
    f = open(filename, "wt")
IOError: [Errno 2] No such file or directory: '2005-07-27\\C/C++\xba\xaf\xca\xfd\xd6\xb8\xd5\xeb.htm'

这是因为在保存一个名为“C/C++”的页面时,脚本视图创建一个名为”C/C++”的htm文件,而在Windows环境下,其中的/为非法字符,所以创建失败,出现了异常(脚本中没有做异常处理)。

所以,在创建文件的时候,需要对文件名做预处理。

功能

把一个字符串中的非法字符换成指定的某个字符。——当然,如果这个指定的字符也是非法的,脚本就不再做特殊处理了,否则就是过设计。

代码

def replace_invalid_filename_char(filename, replaced_char='_'):
    '''Replace the invalid characaters in the filename with specified characater.
    The default replaced characater is '_'.
    e.g. 
    C/C++ -> C_C++
    '''
    valid_filename = filename
    invalid_characaters = '\\/:*?"<>|'
    for c in invalid_characaters:
        #print 'c:', c
        valid_filename = valid_filename.replace(c, replaced_char)

    return valid_filename 

def _test():
    a = [('c/c++', 'c_c++'), ('a\\b:c*d?e"f<g>h|i', 'a_b_c_d_e_f_g_h_i')]
    for item in a:
        x, y = item
        temp = replace_invalid_filename_char(x)
        if temp != y: 
            print "FAIL! Expected: %s, Real: %s" % (y, temp)
        else:
            print "PASS! %s -> %s" % (x, y)

if __name__ == "__main__":  
    _test()

    print "DONE!!!"     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值