• 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:还在起步的小菜鸡,若有错误的地方,欢迎大佬随时指正。。。。。。)

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

  • 相关阅读:
    Java中使用责任链模式
    Java中使用策略模式
    C++字符画圈
    C/C++结构体
    C++判断闰年&日期之差&给定日期求星期几
    C++重载<运算符及排序结构体
    Spring Boot笔记 #02# 构建RESTful Web服务(官方)
    IntelliJ IDEA修改默认的全局Maven路径
    Spring Boot笔记 #01# 快速入门(官方)
    获取某个时间的前一天
  • 原文地址:https://www.cnblogs.com/liangshian/p/11355542.html
Copyright © 2020-2023  润新知