感谢点赞和关注 ,每天进步一点点!加油!
目录
一、文件操作
1.1 Shell里的文件操作
1.2 Python文件操作的步骤
1.3 Python打开和关闭文件
1.3.1 open 函数
1.4 文件定位
1.5 Python文件访问模式
1.5.1 只读模式
1.5.2 只写模式
1.5.3 只追加模式
1.5.4 比较r+,w+,a+三种模式
二、函数
2.1 Shell里的函数
2.2 Python 函数
2.2.1 定义一个函数
2.2.2 函数传参
2.2.3 python 传不可变对象实例
2.2.4 传可变对象实例
2.2.5 参数
一、文件操作
1.1 Shell里的文件操作
shell里主要就是调用awk,sed命令来处理文件, 特别是sed命令可以使用sed -i命令直接操作文件的增,删,改。
1.2 Python文件操作的步骤
python文件的操作就三个步骤:
- open打开一个要操作的文件
- 操作此文件(读,写,追加等)
- close关闭此文件
1.3 Python打开和关闭文件
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。你可以用 file 对象做大部分的文件操作。
1.3.1 open 函数
用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
语法:
file object = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
- file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
- access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
- buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
1.4 文件定位
tell()方法告诉你文件内的当前位置, 换句话说,下一次的读写会发生在文件开头这么多字节之后。
seek(offset [,from])方法改变当前文件的位置。Offset变量表示要移动的字节数。From变量指定开始移动字节的参考位置。
如果from被设为0,这意味着将文件的开头作为移动字节的参考位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。
示例:
fo = open("/root/data02.txt")
print("文件名: ", fo.name)
print( "是否已关闭: ", fo.closed)
print("访问模式: ", fo.mode)
print("光标位置: ", fo.tell())
print("移动光标: ", fo.seek(5))
执行结果:
1.5 Python文件访问模式
访问模式 | 说明 |
==r== (read) | 只读模式,不能写(文件必须存在,不存在会报错) |
==w== (write) | 只写模式,不能读(文件存在则会被覆盖内容(要千万注意),文件不存在则创建) |
==a== (append) | 只追加模式,不能读 |
r+ | 读写模式 |
w+ | 写读模式 |
a+ | 追加读模式 |
rb | 二进制读模式 |
wb | 二进制写模式 |
ab | 二进制追加模式 |
rb+ | 二进制读写模式 |
wb+ | 二进制写读模式 |
ab+ | 二进制追加读模式 |
1.5.1 只读模式
示例:
# 打开文件
f = open("/root/data.txt", "r")
# 打印光标位置 从 0 开始
print(f.tell())
# 读取数据
data = f.read()
print(data)
# 打印光标位置
print(f.tell())
# 光标移动到开始从第10位开始打印
f.seek(10)
print(f.tell()) # 打印光标位置
data1 = f.read()
print(data1) # 打印数据
f.close
执行结果如下:
示例:对比read()、readline() 和readlines()
f = open("/root/data02.txt", "r")
f.seek(5) # 光标移到第6个字符那里
data1 = f.read() # read是读整个文件在光标后面的所有字符(包括光标所在的那个字符),读完后,会把光标移到你读完的位置
f.seek(5) # 光标重置到第6个字符那里
data2 = f.readline() # readline是读光标所在这一行的在光标后面的所有字符(包括光标所在的那个字符),读完后,会把光标移到你读完的位置
f.seek(5) # 光标重置到第6个字符那里
data3 = f.readlines() # readlines和read类似,但把读的字符按行来区分做成了列表
f.close()
print(data1)
print("+++++++++++++++++++++++")
print(data2)
print("+++++++++++++++++++++++")
print(data3)
执行结果:
示例: 遍历文件读取文件某一行
f = open("D:\\IPVA\Data_Traffic\\DataServerCloud01_GetCounters\\DataServerCloud01.Device.CounterArea.PointInfo"
".20230512122021.txt.COMPLETED", "r")
for index, line in enumerate(f):
if index == 1:
print("+++++++++++++++++++++++++++++++++++++++++++++++++++++++")
# 可以 line 转为字符串 对一行数据进行 处理
print(index, line.strip())
f.close()
执行结果:
1.5.2 只写模式
示例:
[root@devops IO]# cat fileW.py
## 文件不存在会创建,存在会清空
f = open("/root/data01.txt","w")
f.write("hello world\n")
f.close
[root@devops IO]# cat /root/data01.txt
hello world
[root@devops IO]#
执行结果:
多次执行会覆盖,且如果要读取文件 会抛出异常
1.5.3 只追加模式
示例:
f = open("/root/data01.txt","a")
f.write("hello world\n")
f.close
执行结果:
小结:
- r: 只读模式 文件必须要存在;
- w: 只写模式 文件存在则会清空原文件内容再写,不存在则会创建文件再写
- a: 只追加模式 与w模式的区别为a模式不清空原文件内容,在最后追加写, (文件不存在也会先创建文件)
1.5.4 比较r+,w+,a+三种模式
- r+文件必须要存在,相当于在只读模式的基础上加了写权限;
- w+会清空原文件的数据,相当于在只写模式的基础上加了读权限;(可以在任意位置写,但要用seek定位光标,还要区分读光标和写光标)
- a+不会改变原文件的数据,相当于在只追加模式的基础上加了读权限;(写是在最后写,即使用seek把光标移到前面,仍然会写在最后)
二、函数
2.1 Shell里的函数
示例:
function start() { # 定义函数名start,前面可以加function也可以不加
/usr/sbin/sshd
}
stop() {
kill -15 `cat /var/run/sshd/sshd.pid`
}
reload() {
kill -1 `cat /var/run/sshd/sshd.pid`
}
restart() {
stop
start # 函数里调函数就是函数的嵌套
}
case "$1" in
start )
start # 调用start函数
;;
stop )
stop
;;
restart )
restart
;;
reload )
reload
;;
* )
echo "参数错误"
esac
2.2 Python 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
2.2.1 定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
语法:
def funct1(): # 函数名(),括号里面可以写参数,也可以不写
"""函数说明或注释""" # 说明或注释可以不写,大型程序为了程序可读性最好写
print("进水") # 函数代码主体
print("洗衣服") # 函数代码主体
print("脱水") # 函数代码主体
return 0 # 函数返回值,可有可无
funct1() # 调用函数的方式(调用函数也就是执行函数内部的代码)
执行结果:
2.2.2 函数传参
可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
- 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
- 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
- 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
- 可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
2.2.3 python 传不可变对象实例
示例:
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print(b) # 结果是 2
2.2.4 传可变对象实例
示例:
def changeme( mylist ):
"修改传入的列表"
mylist.append([1,2,3,4])
print("函数内取值: ", mylist)
return
# 调用changeme函数
mylist = [10,20,30]
print("列表初始元素: ", mylist)
changeme( mylist )
print("函数外取值: ", mylist)
实例中传入函数的和在末尾添加新内容的对象用的是同一个引用,故输出结果如下:
2.2.5 参数
以下是调用函数时可使用的正式参数类型:
- 必备参数 必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
- 关键字参数 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
- 默认参数 调用函数时,默认参数的值如果没有传入,则被认为是默认值
- 不定长参数 你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名
# 必备参数
def printme( str ):
"打印任何传入的字符串"
print(str)
return
#调用printme函数,你必须传入一个参数
printme("kangll")
# 关键字参数
def printme( name , age):
"打印任何传入的字符串"
print(name, str(age) )
return
#调用printme函数
printme( age = 30, name = "My string")
执行结果:
示例:
# 默认参数
def ssh(ip, port = 22):
print("ssh %s -p %s" % (ip, port))
ssh("10.1.1.15")
print("+++++++++++++++++++")
# 不定长参数
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print("输出: ")
print(arg1)
for var in vartuple:
print(var)
return
# 调用printinfo 函数
printinfo( 10 )
printinfo( 70, 60, 50 )
执行结果:
参考:Python 函数 | 菜鸟教程