Python基础(二)

Python基础(二)

文件操作

读操作

f = open('one','r',encoding='utf-8')
data=f.read()     ##默认读取所有,可以指定读取多少个字节
print(data)
f.close()

r+          #写是追加

写操作

f = open('two','w',encoding='utf-8')
f.write('one\n')  ##不存在则会创建一个新文件,存在则覆盖
f.close()
注:写入多行内容,会等到最后一次性全部写入,而不是一行写入一次。

w+          #写是追加

追加

f = open('two','a',encoding='utf-8')
f.write('three\n')
f.close()

修改

with open('file','r',encoding='utf-8') as f:
    line=f.readlines()
with open('file','w',encoding='utf-8') as f1:
    for i in line:
        if 'zyl' in i:
            i=i.replace('zyl','wq')
        f1.write(i)

注:一个文件同时只能以打开一次,如果打开多次最后一次打开模式会替换之前的模式。

方法

f = open('one',encoding='utf-8')
打印一行
f.readline()

打印所有行,以列表形式展现
f.readlines()

打印文件光标位置
f.tell()

移动文件光标位置,根据字节来移动
seek(offset [,from])  
##在utf-8中一个汉字占3个字节,所以文件如果是中文移动必须是3的倍数。offset,移动几位。from,从什么位置开始移动。  
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置,只有在二进制(rb,wb,ab)模式下才可以使用。

打印文件编码
f.encoding

打印文件名称
f.name

实时的写入文件
f.flush()

截断内容,仅在‘a’模式下使用,只能从开头截断,无法使用seek跳转到具体位置
f.truncate(10)

内存中可以添加数据,而硬盘中不能添加,添加会将原有位置上的数据覆盖掉。

with语句

字符编码

unicode所有字符都占两个字节
ASCLL码所有字符都占一个字节
UTF-8,英文字符都占一个字节,中文字符都占三个字节
encode(编码):按照某种规则将“文本”转换为“字节流”。 python3中表示:unicode变成bytes
decode(解码):将“字节流”按照某种规则转换成“文本”。python3中表示:bytes变成unicode,也可以变为其它类型

函数

面向过程编程和面向函数编程
面向过程编程其实就是没有return的函数

定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

语法
Python 定义函数使用 def 关键字,一般格式如下:

def 函数名(参数列表):
    函数体

优点

  • 代码重用
  • 保持一致性
  • 可扩展性

函数返回值

  • 返回值数=0:返回None
  • 返回值数=1:返回object
  • 返回值数>1: 返回tuple

函数传参
形参与实参需要一一对应,不能多或者少

关键字传参
注:关键字参数必须放在位置参数后面

默认参数
特点:调用函数时,默认参数非必须传递

*args和**kwargs

  • *args:把N个参数,转换为元组
  • **kwargs: 把N个关键字参数,转换为字典
  • *args和**kwargs必须放到最后

变量作用域

  • global: 函数内修改全局变量。
  • 集合,列表,字典,类都可以在函数内修改,只有字符串不可以。
  • 在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
  • 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
  • 当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
示例:

def zyl(n):
    print(n)
    if int(n/2) ==0:
        return n
    return zyl(int(n/2))

zyl(10)

输出:
10
5
2
1

特性:

  • 必须有一个明确的结束条件
  • 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def add(x,y,f):
    return f(x) + f(y)
res = add(3,-6,abs)
print(res)
注:abs函数是获取数字的绝对值

打印当前行的下一行

f = open('one','r')
b=False
count=1
for i in f:
    if count ==2:
        b=True
    elif b:
        print(i)
        b=False
    count+=1

打印当前行的后几行

f = open('one','r')
b=False
count=5
for i in f:
    if i.find('111') >=0:
        b=True
    elif b and count:
        print(i.strip())
        count-=1

每日练习
程序1: 实现简单的shell sed替换功能
代码如下:

import os,sys

if len(sys.argv[1:]) != 3:
    print('输入的参数数量不正确')
    sys.exit()

source=sys.argv[1]
target=sys.argv[2]
if os.path.isfile(sys.argv[3]):
    file = sys.argv[3]
else:
    print('文件不存在')
    sys.exit()

def openfile():
    with open(file,'r') as f:
        content=f.readlines()
    return content

def writefile():
    lines=openfile()
    with open(file,'w') as f:
        for line in lines:
            if source in line:
                line=line.replace(source,target)
            f.write(line)

writefile()

程序2:修改haproxy配置文件
需求:

1、查
    输入:www.oldboy.org
    获取当前backend下的所有记录
2、新建
    输入:{'bakend': 'www.oldboy.org','record':{'server': '100.1.7.9','weight': 20,'maxconn': 30}}
3、删除
    输入:www.oldboy.org
    删除当前backend下的所有记录

代码如下:


options=['search','add','delete']
def openfile():
    with open('file1','r') as f:
        content=f.readlines()
    return content

def displayoptions():
    for index,opt in  enumerate(options,start=1):
        print(index,opt,sep=' ')

def search(keyword):
    lines=openfile()
    count=2
    b=False
    for line in lines:
        if line.startswith('backend') and line.find(keyword) >=0:
            b=True
        elif b and count:
            print(line.strip())
            count-=1
def add(arg):
    with open('file1','a') as f:
        f.write('\nbakend  %s' % arg['bakend'])
        f.write('\n\t server {} weight {} maxconn {}'.format(arg['record']['server'],arg['record']['weight'],arg['record']['maxconn']))

def delete(keyword):
    lines = openfile()
    count=2
    b=False
    with open('file1','w') as f:
        for line in lines:
            if keyword in line:
                b=True
                continue
            elif b and count:
                count-=1
                continue
            f.write(line)
def man():
    while True:
        displayoptions()
        choice=input('请输入你的操作: ')
        if choice.isdigit():
            choice=int(choice)
            if choice <= 3 and choice >= 1:
                if choice == 1:
                    keyword=input('请输入关键字: ')
                    eval(options[choice-1])(keyword)
                elif choice == 2:
                    keyword=input('请以字典格式写入内容: ')
                    if not isinstance(eval(keyword),dict):
                        print('数据格式不正确,请重新输入',type(eval(keyword)))
                        continue
                    eval(options[choice-1])(eval(keyword))
                else:
                    keyword = input('请输入关键字: ')
                    eval(options[choice - 1])(keyword)
            else:
                print('输入的数字不在有效范围内')
        else:
            print('输入非数字')

if __name__ == '__main__':
    man()


原文地址:https://www.cnblogs.com/SleepDragon/p/10372808.html