這兩天在寫一個新聞類的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:還在起步的小菜雞,若有錯誤的地方,歡迎大佬隨時指正。。。。。。)
******************************不積跬步,無以至千里。******************************