这两天在写一个新闻类的spider时,遇到了OSError: [Errno 22] Invalid argument这个错误,苦恼的两天,无果。后来通过请教学长,发现原来是打开的文件名中含有一些系统的敏感字符,结果就报错了。看一段简单的代码:



1 title = '把我看成新闻的*标题吧。'
 2 contetn = '就把我看成是新闻的内容吧!!!'
 3 with open(title+'.txt', 'a', encoding='utf-8') as f:
 4     f.write(contetn)
 5 
 6 # 报错内容如下:
 7 # Traceback (most recent call last):
 8 #   File "E:/py project/my_spider/east_money/test2.py", line 3, in <module>
 9 #     with open(title+'.txt', 'a', encoding='utf-8') as f:
10 # OSError: [Errno 22] Invalid argument: '把我看成新闻的*标题吧。.txt'



可以看出,报错的内容在第三行,错误提示是无效的参数,观察一下第三行的代码,猜想应该是title里面的内容存在错误,试着把里面的那个 ‘*’ 去掉,结果报错没有了。原来,windows下文件命名的时候不能含有一些特殊的字符,要不会与系统冲突,网上搜了一下,共有九个敏感字符,分别是 ? * : " < > \ / | 。这些字符在系统中都有特殊的作用

找到了原因,尝试着解决。

1:replace方法

首先尝试用replace()函数替换掉 ‘*’ 字符,方法成功。



title = '把我看成新闻的*标题把。'.replace('*', '')



但聪明的小伙伴可能已经想到,那要是出现另外八个字符,不就又报错了嘛。没错,所以可以用另外一种方法。

2:translate方法



intab = "?*/\|.:><"
outtab = "         "
trantab = str.maketrans(intab, outtab)
title = '把我看|成?新.闻\的*标题把。'.translate(trantab)
contetn = '就把我看成是新闻的内容把!!!'
with open(title+'.txt', 'a', encoding='utf-8') as f:
    f.write(contetn)



这里用到了两个字符串的方法,第一个是maketrans,第二个是translate, maketrans() 方法用于创建字符映射的转换表,接受两个参数,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串,表示转换的目标。

translate() 方法根据参数table给出的表(包含 256 个字符)转换字符串的字符,table -- 翻译表,翻译表是通过maketrans方法转换而来。这里把每个敏感字符都替换成了空格。

3:遍历替换方法,如下



intab = "?/|\.><:*"
title = '把我?看/成|新\闻的标题把。'
for s in intab:
    if s in title:
        print(s)
        title = title.replace(s, '')
print(title)



首先依次遍历字符串,然后利用 in 关键字检查 title中是否存在敏感字符,如果存在,则替换,并重新赋值给tiitle,因为字符串的replace方法不能改变原字符串的内容。上述代码输出结果如下:

?
/
|
\
把我看成新闻的标题把。

4:总结

windows下文件名中不能出现这些敏感字符 ? * : " < > \ / | ,

如果需要作为文件名的字符串中存在这些敏感字符,则可以用replace方法或maketrans和translate结合的方法解决

(ps:还在起步的小菜鸡,若有错误的地方,欢迎大佬随时指正。。。。。。)

******************************不积跬步,无以至千里。******************************