Python:OSError: [Errno 22] Invalid argument: 'D:/tanchong/PycharmPrograms/untitled/Project01/tests\\report\\2019-10-22 14:29:43TestReport.html'错误

部分代码如下:
def getTime():
return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))

def run():
# print(os.path.join(os.path.dirname(__file__),'report',getTime()+'TestReport.html'))
fp=os.path.join(os.path.dirname(__file__),'report',getTime()+'TestReport.html')
# filename=getTime()+'report.html'
# fp=open(filename,'wb')
HTMLTestRunner.HTMLTestRunner(
stream=open(fp,'wb'),
title='自动化测试报告',
description='自动化测试报告详细信息'
).run(alltests())

报错:OSError: [Errno 22] Invalid argument: 'D:/tanchong/PycharmPrograms/untitled/Project01/tests\\report\\2019-10-22 14:29:43TestReport.html'

原因:windows下文件命名的时候不能含有一些特殊的字符,要不会与系统冲突,网上搜了一下,共有九个敏感字符,分别是 ? * : " < > \ / | 。这些字符在系统中都有特殊的作用,函数getTime中,时间格式中包含冒号,修改冒号为-即可解决:

    def getTime():

       return time.strftime('%Y-%m-%d %H-%M-%S',time.localtime(time.time()))


在网上找到了其他解决办法,记录如下:

1:replace方法

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

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

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

2:translate方法

1
2
3
4
5
6
7
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:遍历替换方法,如下

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

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

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

4:总结

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

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

猜你喜欢

转载自www.cnblogs.com/tanchong1116/p/11719634.html