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!!!"