部分代码如下:
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
s
in
intab:
if
s
in
title:
print
(s)
title
=
title.replace(s, '')
print
(title)
|
首先依次遍历字符串,然后利用 in 关键字检查 title中是否存在敏感字符,如果存在,则替换,并重新赋值给tiitle,因为字符串的replace方法不能改变原字符串的内容。上述代码输出结果如下:
?
/
|
\
把我看成新闻的标题把。
4:总结
windows下文件名中不能出现这些敏感字符 ? * : " < > \ / | ,
如果需要作为文件名的字符串中存在这些敏感字符,则可以用replace方法或maketrans和translate结合的方法解决