python使用open的OSError: [Errno 22] Invalid argument錯誤


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

******************************不積跬步,無以至千里。******************************

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM