【python】一篇文章入门python去写shell

1 基础

有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(比如 Windows 下的 .exe 文件),比如C语言、C++、Golang、汇编语言等,它们都属于编译型语言,使用的转换工具称为编译器

有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 PythonJavaScriptPHP、Shell 等,这类编程语言称为解释型语言,使用的转换工具称为解释器

注意:python使用的是对其方式来区分同一级的逻辑控制。不使用分号(;)所以设置的时候,一定要设置好一个tab对4个空格,不要使用tab,不然换到其他编辑器中,容易报语法错误。tab和空格不要混用。

python 中都是通过import去导入一些系统包或者自己写的包。这个和java的操作很相似,也和c中的#include <某些.h>相似。

毕竟市面上绝大多数的python的底层逻辑都是用c去写的。

加减乘除取余就不赘述了。所有编程的语法都是大同小异的。

python在linux的环境下不需要安装,我们使用的图形化界面都是以python和一些桌面管理为基础的。

一般存在的路径在/usr/bin/python, 查看python 默认的版本,直接python -v

python文件开头解释器说明。我是用python3版本的。编码格式为utf-8

#!/usr/bin/python3
# -*- coding: utf-8 -*-

函数入口我一般是这样定义的

if __name__ == '__main__':
    main()

然后在定义出main函数的运行内容

def main():
	执行语句

1.1 流程控制

选择控制

def ifTest():
    i = random.randint(1,100)
    print("随机生成的数字为",i)
    if i%2 == 0:
        print("是个偶数")
    else:
        print("是个奇数")

选择控制的格式如下:

if 条件:
	执行命令
elif 条件:
	执行命令
else:
	执行命令

循环控制 while循环和for循环的示例如下:

def whileTest(i):
    count = 0
    while i > 0 :
        i -=1
        count+=1
        print("循环的第",count,"次")

def forTest(i):
    for count in range(i):
        print("循环的第",count,"次")
    for count in range(0,i,3):
        print("步进循环的第",count,"次")

python不提供switch语句。虽然可以自己实现,但是我觉得没啥必要的。

1.2 数据类型

python中有6个标准的数据类型:

  • Number(数字型号)
  • String(字符串型号)
  • List(列表)
  • Tuple(元组)
  • Sets(集合)
  • Dictionaries(字典)

number

int(x) 将x转换为一个整数。

float(x) 将x转换到一个浮点数。

complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。

complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。

String

索引

字符串直接拿引号包起来就可以了。

索引下标[-1]表示倒数第一个。

    s = '0123456789'
    s1 = s[0]
    print('s[0] = ' + s1)   #s[0] = 0
    print('s[3] = '+ s[3])  #s[3] = 3
    print('倒数第三个数为:' + s[-3])   #倒数第三个数为:6
    print('最后一个数为:' + s[-1])     #最后一个数为:8

切片

    s = '0123456789'
    s2 = s[0:3]
    print('s[0:3] = ' + s2)     
    #s[0:3] = 012

    print('整个字符串如下:' + s[:])    
    #整个字符串如下:0123456789

    print('整个字符串如下:' + s[0:])   
    #整个字符串如下:0123456789

    print('前两个字符:' + s[:2])      
    #前两个字符:01

跳首

    s = "01234567489"
    print(s[0:6:2]) #行首0,行尾6,间隔2 取 打印出024
    print(s[::2])      #024649
    print(s[4:0:-1])   #倒着取:4321
    print(s[3::-1])    #3210
    print(s[-1::-1])   #98476543210
常见的字符串操作
  • 大小写操作

        s = "adbCDefg"
        print("首字母大写",s.capitalize())
        print("全部大写  ",s.upper())
        print("全部小写  ",s.lower())
        print("大小写互换",s.swapcase())
    
  • 删除空格操作

        s = '  xtt  123'
        s_1 = s.strip()             #删除字符串前后的空格    
        print(s_1)                  #xtt 123
        s_2 = s.strip('%')          #删除字符串前后的空格 
        print(s_2)                  #  xtt  123
        s_3 = s.replace(" ","")     #替换掉所有的空格
        print(s_3)                  #使用join()方法将字符串中所有的空格删除
        s=' This is a demo code'
        print(''.join(s.split()))   #Thisisademo
        #其中,join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
    
  • 计算字符出现的次数count

        s = '  xtt  123 xtt'
        count = s.count("t")
        print(count)  #打印出现的次数为4次
    
  • 分割。split不加任何参数则默认空格

    s1 = 'I am the king of amazon!!!'
    s2 = 'I am the: king: of amazon:'
    s_1 = s1.split()
    print(s_1)              #['I', 'am', 'the', 'king', 'of', 'amazon!!!']
    s_2 = s2.split(':')
    print(s_2)              #['I am the', ' king', ' of amazon', '']
  • 格式化输出

        s12_1 = '我叫{},今年{}岁,爱好{},再说一下我叫{}'.format('小明',22,'学习','小明')
        print(s12_1)  
        s12_2 = '我叫{0},今年{1}岁,爱好{2},再说一下我叫{0}'.format('小明',22,'学习')
        print(s12_2)
        s12_3 = s1 = '我叫{name},今年{age}岁,爱好{hobby},再说一下我叫{name}'.format(name = '小明',age = 18,hobby = '学习')
        print(s12_3)
    

List

list列表可以存放多个值,创建list列表,使用[ ],多个值之间用逗号隔开,不限制数据类型

    l1 =["joenero","amazon","joker","father","was"]
    print(l1)								#['joenero', 'amazon', 'joker', 'father', 'was']
    print(l1[0:4:2])						#['joenero', 'joker']
    print(l1[-3:-1])						#['joker', 'father']

list相关的方法如下:

方法说明
.append(元素)向列表最后追加一个元素
.extend(元素)向列表最后追加多个元素
.insert(下标,元素)向指定的下标位置插入元素
.pop(下标)移除下标指定的元素,如果没有指定的下标,则删除最后一个元素
.remove(元素)删除指定元素
.clear()清空列表
.index(元素)获取指定元素在list列表中的第一次出现的下标
.count(元素)统计元素在list列表中出现的次数
.reverse()反转list列表
.sort()排序.默认是升序,降序添加参数:reverse=True

这三比较复杂,会在之后单独拎出来讲解

  • Tuple(元组)
  • Sets(集合)
  • Dictionaries(字典)

2 添加help参数

一般我们写一个需要外部输入的参数,我们都需要借用解析器argparse去获取和解析对应的内容

import argparse

def help():
    parser = argparse.ArgumentParser()
    parser.add_argument('-f',help='PSS文件')
    parser.add_argument('-o',help='生成的图片')
    args = parser.parse_args()
    print(args)  				#打印存储的所有输入值
    print(args.f)				#打印存储的-f 之后的值
    print(args.o)				#打印存储的-o 之后的值

然后运行这个py文件后面加-h的参数就可以显示对应的help值

例如上面的内容显示如下:

python plot.py -h
usage: plot.py [-h] [-f F] [-o O]

optional arguments:
  -h, --help  show this help message and exit
  -f F        PSS文件
  -o O        生成的图片

3 文件操作

基础

  • open

    file = open("fileName.txt",mode="r")
    
    模式描述
    ‘r’以「只读」模式打开文件,如果指定文件不存在,则会报错,默认情况下文件指针指向文件开头
    ‘w’以「只写」模式打开文件,如果文件不存在,则根据 filename 创建相应的文件,如果文件已存在,则会覆盖原文件
    ‘a’以「追加」模式打开文件,如果文件已存在,文件指针会指向文件尾部,将内容追加在原文件后面,如果文件不存在,则会新建文件且写入内容
    ‘t’以「文本文件」模式打开文件
    ‘b’以「二进制」模式打开文件,主要用于打开图片、音频等非文本文件
    ‘+’打开文件并允许更新(可读可写),也就是说,使用参数 w+、a+ 也是可以读入文件的,在使用的时候,需要注意区别
        file = open("fileName.txt",mode="r")
        num = 1
        for line in file:
            print("第",num,"行内容:",line)
            num +=1
        file.close()
    
  • read(): 直接读取整个文件。

        file = open("fileName.txt",mode="r")
        fileCon = file.read()
        print(fileCon)
        
        with open(file=r"fileName.txt",mode="r",encoding="utf-8") as f:
            content = f.read()
            print(content)
    
  • readline():读一行

  • readlines():按行读取所有数据。结果为列表,一行为一个成员。

实例

直接举个实际例子如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@File    : main.py
@Author  : JoeNero
@Time    : 2022/12/30 16:32
"""
import argparse
import fileinput
import re
import matplotlib.pyplot as plt
from scipy.signal import find_peaks

fileName = ""
outTxt   = ""

class INFO:
    def __init__(self):
        self.username = ""
        self.password = ""

def help():
    global fileName
    global outTxt
    parser = argparse.ArgumentParser()
    parser.add_argument('-f',help='对应的TXT文件')
    parser.add_argument('-o',help='生成的文件')
    args = parser.parse_args()
    fileName = args.f
    outTxt = args.o

#读取解析txt
def readTxt(filename):
    count = 0
    aInfo = INFO()
    for line in fileinput.input(filename):
        if count == 0:
            temp = line.split('username:')[1]
            temp = temp.replace("\n","")
            # print("temp",temp)
            aInfo.username = temp
        else :
            temp = line.split('password:')[1]
            # print("temp",temp)
            temp = temp.replace("\n","")
            aInfo.password = temp
        count+=1
    print("username",aInfo.username,"password",aInfo.password)
        
#主函数入口
def main():
    help()
    if fileName == None or len(fileName):
        print("输入文件不能为空")
    else :
        readTxt(fileName)

if __name__ == '__main__':
    main()

我这边是有个外部文件。其格式如下,可以通过以上的内容来读取解析其中的内容。

username:xtt
password:123456

生成临时文件. 路径为/tmp/tmp06pz62p5 文件名字为随机

import tempfile

def main():
    dir_name = tempfile.mkdtemp()
    print (dir_name)

if __name__ == '__main__':
    main()

4 shell

python有很多操作shell的方式。需要先import 的包

import os

第一种方式是直接用os.system(“command”),其中返回0,表示执行命令成功,明显的缺点是无法将返回的值保存下来

devices = os.system("adb devices")

第二种方式是用os.popen(“command”)

os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。

devices = os.popen("adb devices")
print("deviecs = ",devices.read())

打印输出的结果为

deviecs =  List of devices attached
L7Z5AABQAILZPBTO        device

配合下将其修改成如下的内容,就可以把对应的adb设备获取出来,当前只能获取到最上面的那个,可以自己根据逻辑来完善

devices = os.popen("adb  devices|awk '{print $1}'|sed -n '2p'")
print("deviecs = ",devices.read())

注意:popen中主要涉及到文件上的操作,但是一些shell中的sleep和拍照等操作不需要返回值还是用system来操作。

我实际操作拍照的时候,发现存在的这个问题。popen不生效,只有system的才生效。

5 类

python中的类和c++的及其相似。

#定义INFO类,用来存储
class INFO:
    def __init__(self):
        self.username = ""
        self.password = ""
        
#使用
aInfo = INFO()
aInfo.username = temp
aInfo.password = temp

6 import

python import 和包含头文件的用法相似。

在同一个目录下直接import 文件名即可

导入模块的方式有如下几种:

#hello.py
def say ():
    print("Hello,World!")

#say.py
import hello
hello.say()

临时添加模块完整路径如下:

    import sys
    sys.path.append('D:\\python_module')

"from 模块名 import 成员"的形式直接导入指定成员

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高启强不卖鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值