Python系列之文件操作和函数

    感谢点赞和关注 ,每天进步一点点!加油!

目录

一、文件操作

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 参数


Python 系列文章学习记录:

Python系列之Windows环境安装配置_开着拖拉机回家的博客-CSDN博客

Python系列之变量和运算符_开着拖拉机回家的博客-CSDN博客

Python系列之判断和循环_开着拖拉机回家的博客-CSDN博客

Python系列之字符串和列表_开着拖拉机回家的博客-CSDN博客

Python系列之文件操作和函数_开着拖拉机回家的博客-CSDN博客

Python系列模块之标准库OS详解_开着拖拉机回家的博客-CSDN博客

Python系列模块之标准库re详解_开着拖拉机回家的博客-CSDN博客

Python系列模块之标准库json详解_开着拖拉机回家的博客-CSDN博客

Python系列模块之标准库shutil详解_开着拖拉机回家的博客-CSDN博客


一、文件操作


1.1 Shell里的文件操作


shell里主要就是调用awk,sed命令来处理文件, 特别是sed命令可以使用sed -i命令直接操作文件的增,删,改。

1.2 Python文件操作的步骤


python文件的操作就三个步骤:

  1. open打开一个要操作的文件
  2. 操作此文件(读,写,追加等)
  3. 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 函数 | 菜鸟教程 

猜你喜欢

转载自blog.csdn.net/qq_35995514/article/details/130784085
今日推荐