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

 title = '把我看成新闻的*标题吧。'
contetn = '就把我看成是新闻的内容吧!!!'
with open(title+'.txt', 'a', encoding='utf-8') as f:
f.write(contetn) # 报错内容如下:
# Traceback (most recent call last):
# File "E:/py project/my_spider/east_money/test2.py", line 3, in <module>
# with open(title+'.txt', 'a', encoding='utf-8') as f:
# 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:还在起步的小菜鸡,若有错误的地方,欢迎大佬随时指正。。。。。。)

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

python使用open的OSError: [Errno 22] Invalid argument错误的更多相关文章

  1. 在使用python语言的open函数时,提示错误OSError: [Errno 22] Invalid argument: ‘文件路径’

    如题,在使用python语言的open函数时,提示错误OSError: [Errno 22] Invalid argument: '文件路径',在查阅了大量资料后也得到了一些解决方案,但是这些解决方案 ...

  2. 【Selenium】【BugList9】windows环境,fp = open("./"+ time.strftime("%Y-%m-%d %H:%M:%S") + " result.html",'wb'),报错:OSError: [Errno 22] Invalid argument: './2018-09-05 10:29:32 result.html'

    [代码] if __name__=="__main__": suite = unittest.TestSuite() suite.addTest(Baidu("test_ ...

  3. python OSError: [Errno 22] Invalid argument: 'D:\\crawle\x01.html1'

    import urllib.request file = urllib.request.open("http://www.baidu.com") data = file.read( ...

  4. 【Selenium + Python】路径报错之OSError: [Errno 22] Invalid argument: './t/report/2018-03-23_11:03:12_report.html'

    现象: 此问题真的是太痛苦了,查了好多资料是说路径的问题,结果还是报错,后来一点点的排查才发现原来是!!!!!! 废话不多说上原来代码: if __name__ == '__main__': star ...

  5. python OSError: [Errno 22] Invalid argument: '\u202aF://text

    windows10 python3 读文件的时候报的错误 原因不明时好时坏很头疼但又没办法不知道怎么解决,网上的说法都不能解决,

  6. tensorboard OSError:[Errno 22] Invalid argument

    哈哈 问题解决了.感谢大佬 Bill.Z 附上原文链接:https://blog.csdn.net/u013244846/article/details/88380860 解决方法:更改manager ...

  7. OSError: [Errno 22] Invalid argument: 'D:\x07ckup\test.txt'

    使用with open("D:\backup\test.txt","rt") as f:报上面的错误,将上面的语句改成 with open(r"D:\ ...

  8. Python创建文件报错OSError:[Errno 22] Invalid argument处理

    问题: windows平台下使用python open函数w模式打开文件报错“OSError: [Errno 22] Invalid argument: '../news/“消费升维”成零售业新风口? ...

  9. tensoboard [Errno 22] Invalid argument 以及 Invalid format string问题解决

    Invalid argument 问题解决: 需要保证tensorboard与tensorflow版本一致. Invalid format string 问题解决: 修改 manager.py 文件中 ...

随机推荐

  1. gcc-stack-protector机制【转】

    转自:https://blog.csdn.net/lhl_blog/article/details/70193865 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上 ...

  2. 3天学会kettle -全网最全的kettle教程

    从资源库开始,详细讲解了kettle的所有控件的用法,无论你是开发人员.运维人员还是测试人员. 通过此教程都可以很快速的掌握kettle,再加上笔者的实例,3天学会kettle的实战操作. 欢迎关注公 ...

  3. FFT/NTT初探

    做了全家桶然后写了几道入门题. FFT.ref NTT.ref Luogu4238 [模板]多项式求逆 Link 套牛顿迭代完事.有一个细节问题是:这次运算多项式有几项就只赋几项的值,其他位置(次数大 ...

  4. Hbase启动出问题 master.HMaster: Failed to become active master

    Hbase启动出问题 2019-12-15 09:59:57,183 WARN [hadoop:16000.activeMasterManager] hdfs.DFSClient: DFS Read ...

  5. Global Azure Bootcamp 2019 宁波站活动总结

    4月27日,由微软MVP技术社区发起的Global Azure Bootcamp 2019盛会在全球80多个国家270个城市举办.本次活动由全国众多Azure专家及微软MVP技术社区成员,分别在北京. ...

  6. Zotero入门精通

    一.Zotero简介 Zotero作为一款协助科研工作者收集.管理以及引用研究资源的免费软件,如今已被广泛使用.此篇使用说明主要分享引用研究资源功能,其中研究资源可以包括期刊.书籍等各类文献和网页.图 ...

  7. dom元素上添加断点(使用dom breakpoint找到修改属性的javascript代码)

    使用dom breakpoint能快速找到修改了某一个dom element的JavaScript code位于何处.在Chrome development tool里,选中想要inspect的dom ...

  8. 【shell脚本】一键部署LNMP===deploy.sh

    一键部署mysql,php,nginx,通过源码安装部署 #!/bin/bash # 一键部署 LNMP(源码安装版本) menu() { clear echo " ############ ...

  9. Java设计模式:Prototype(原型)模式

    概念定义 使用原型实例指定待创建对象的种类,并通过拷贝该原型来创建新的对象.Prototype模式允许一个原型对象克隆(复制)出多个与其相同的对象,而无需知道任何如何创建的细节. 应用场景 对象的创建 ...

  10. Python - ^在正则表达式中的作用

    ^在正则表达式中有两个作用,一是表达以什么开头,二是表达对什么取反.有时候经常傻傻的分不清楚,接下来给大家详细介绍该怎么用这个^准备一个python文件test.py,借用re.search函数举例说 ...