python中遇到的问题_Python中遇到的⼩问题及解决⽅法汇总本⽂会把学习过程中遇到的⼀些⼩问题和解决办法放在这⾥,以便于⼤家能够更好地学习。
⼀、Python的异常处理
因为想到⾃⼰不断尝试写⼩程序的话会⽤到抛出异常信息来判断哪⾥出现了问题:
usage: raise [Exception [, args [, trackback]]]
上⾯是Python的raise的⽤法,下⾯是⾃⼰⽤这个⽅法实现异常的抛出⽅法:
def check_args(args):
if not args.host:
msg = 'Args missing! One of the following args should be specified \n' \
'--host 192.168.1.1 \n' \
'-f TargetFile \n'
raise Exception(msg)
#参考别⼈的代码模式,我这样写来抛出异常.
⼆、list转str
这个问题是因为⾃⼰的⽆知吧:
命令⾏传⼊的host(即ip地址)是list形式,想要通过list转为str的格式之后来进⾏t() , 报错:
⾃⼰想象的姿势:
正确的姿势:
上图证明⾃⼰的愚蠢(可能下次还会犯同样的错):
三、argparse函数
出发的动机是因为⾃⼰写的⼩程序要通过命令⾏的形式传参并执⾏命令.
⽤⾃⼰的简单⼩实例来显⽰函数的具体⽤法吧:
def parse_args():
parser = argparse.ArgumentParser(prog = 'hello',
formatter_class = argparse.RawTextHelpFormatter,
description = '* A tiny toy for fun *\n'
'By ST(www.********)',
usage = 'hellPLC.py [options]')
parser.add_argument('-host', metavar = 'HOST [HOST2 HOST3 ...]', type = str,
default = '', nargs = '*',
help = 'Scan the host form command line')
代码很简单,⼀看就懂⼤概函数是什么样⼦,重点是add_argument的参数,当你传⼊的cmd参数是这种⽅式的话:
我们可以看到,需要在-p之后跟⼀个int型的参数才可以,还有另外⼀种形式.
parser.add_argument('-p', metavar = 'PORT', type = int,
default = '')
这种⽅式不需要跟参数,只需要类似于"python -h"这种形式就可以执⾏并得到想要的结果:
这⾥就需要对这个函数的各个参数的功能有个基本的了解,这样才能⽤起来舒服.
parser.add_argument('-b', default= False, dest='b', action='store_true',
help = 'Get the base info')
下图就是我们可以跟的参数,⾃⼰的问题就是区分清楚action和dest这两个参数,还有default,type等.
四、正则匹配
这个东西有点⾼深了,最初的想法是使⽤正则来转变接收到的数据的格式,问过达哥之后原本recv到的数据在encode之后的类型是"str",之前⾃⼰的想法是把数据转成list格式,之后提取之类的⽅便,但"str"类型也可以直接利⽤偏移来进⾏分析也可以,直接⽤"str[]"就可以搞定,因为这个过程中不需要可视化的打印出来,需要打印的是分析之后的结果,所以正则先⽤不到。
不过还是要把觉得不错的链接放⼀下:
Python⼊门篇之正则表达式
Python 匹配任意字符(包括换⾏符)的正则表达式写法
五、格式化字符串
temp = '123456'
print("word:%s" %temp)
output: word:123456
很简单就可以搞定,但是当时想要返回取多个返回值,⼀下⼦蒙住不知道怎么搞了,呵呵了~
f.write ("Block Type: %s \n"
"Block count: %s \n"
%(block_type, block_count))
return block_type, block_count
六、⽂件读写操作
这个问题别⼈的博客写的很好很详细了
f = open(r'C:\','w')
直接打开⼀个⽂件,如果⽂件不存在则创建⽂件,只能只⽤写命令
f = open(r'C:\')
python怎么读取py文件打开⼀个⽂件,只能只⽤读命令
size为读取的长度,以byte为单位,如果不写则读取全部内容
读⼀⾏,如果定义了size,有可能返回的只是⼀⾏的⼀部分。每读取⼀次,⽂件操作符向下移动⼀⾏。
把⽂件每⼀⾏作为⼀个list的⼀个成员,并返回这个list。其实它的内部是通过循环调⽤readline()来实现的。如果提供size参数,size是表⽰读取内容的总长,也就是说可能只读到⽂件的⼀部分。
关于open模式,参数不同达到的效果也是不同的,⽐如我需要的是在⼀个⽇志⽂件中不断的追加新的东西⽽不是每次都直接覆盖掉,所以我⽤到了"a+"
关于open模式的参数:
w 以写⽅式打开
a 以追加模式打开
r+ 以读写模式打开
w+ 以读写模式打开
a+ 以读写模式打开 (我⽤到了这个模式,读写模式不断追加新的东西)
rb 以⼆进制读模式打开
wb 以⼆进制写模式打开
ab 以⼆进制追加模式打开
rb+ 以⼆进制读写模式打开11 wb+ 以⼆进制读写模式打开12 ab+ 以⼆进制读写模式打开
还有⼀些操作的区别,我当时⽤到的问题是f.readline,每次都是读⽂件的⼀⾏,没有把全部的内容都读出来,所以区别还是很明显,要区分清楚.
写操作的⽤法和区别:
f.write(“str”)
把str写到⽂件中,write()⽅法不会在str后加上⼀个换⾏符
f.writelines(seq)
把seq的内容全部写到⽂件中(多⾏⼀次性写⼊)。这个函数也只是忠实地写⼊,不会在每⾏后⾯加上任何东西。
f.close()
关闭⽂件。在读命令或者写命令结束时,需要⽤关闭。如果⽂件关闭后依然操作,会抛出ValueError: I/O operation on closed file
返回⽂件操作标记的当前位置,以⽂件的开头为起点
<()
返回下⼀⾏内容,并将⽂件操作标记位移到下⼀⾏。把⼀个file⽤于for … in file这样的语句时,就是调⽤next()函数来实现遍历的。
fp.seek(offset[,whence])
将⽂件操作标记为移动到offset位置。
七、遇到的报错情况
⾃⼰不想要定义太多的函数,个⼈感觉是想要将不同功能的函数进⾏分类,因此我尝试⽤到了类,知道⾃⼰这么做可能是想法上就有些不对的,但是想要瞎试试看看效果,所以结果就是报错了.
如图,这是别⼈遇到的⽅法,和我的是⼀样的,我没有定义静态的函数,所以每次使⽤之前都需要进⾏实例化才能调⽤.
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。