三、文件的操作、函数、类和对象

摘要:
访问模式指示r以只读方式打开文件。Rb以二进制格式打开只读文件。Wb以二进制格式打开文件,仅用于写入。A+打开一个文件进行读取和写入。Rb+以二进制格式打开文件,用于读取和写入。Wb+以二进制格式打开文件以进行读取和写入W')#关闭f.Close()文件的读取和写入<写入数据(Write)使用Write()将数据写入文件。演示:
一、文件

文件的打开与关闭

在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件

open(文件名,访问模式)

示例如下:

  f = open('test.txt', 'w')
说明:
访问模式说明
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

<2>关闭文件

close( )

示例如下:

 # 新建一个文件,文件名为:test.txt
    f = open('test.txt', 'w')

    # 关闭这个文件
    f.close()

文件的读写

<1>写数据(write)

使用write()可以完成向文件写入数据

demo:


f = open('test.txt', 'w')
f.write('hello world, i am here!')
f.close()

<2>读数据(read)

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据

demo:

f = open('test.txt', 'r')

content = f.read(5)

print(content)

print("-"*30)

content = f.read()

print(content)

f.close()

注意:

  • 如果open是打开一个文件,那么可以不用谢打开的模式,即只写 open('test.txt')
  • 如果使用读了多次,那么后面读取的数据是从上次读完后的位置开始的

<3>读数据(readlines)

就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素

#coding=utf-8

f = open('test.txt', 'r')

content = f.readlines()

print(type(content))

i=1
for temp in content:
    print("%d:%s"%(i, temp))
    i+=1

f.close()

<4>读数据(readline)

一行一行读

#coding=utf-8

f = open('test.txt', 'r')

content = f.readline()
print("1:%s"%content)

content = f.readline()
print("2:%s"%content)

f.close()

文件的随机读写

<1>获取当前读写的位置

在读写文件的过程中,如果想知道当前的位置,可以使用tell()来获取

 # 打开一个已经存在的文件
    f = open("test.txt", "r")
    str = f.read(3)
    print"读取的数据是 : ", str)

    # 查找当前位置
    position = f.tell()
    print "当前文件位置 : ", position

    str = f.read(3)
    print( "读取的数据是 : ", str)

    # 查找当前位置
    position = f.tell()
    print( "当前文件位置 : ", position)

    f.close()

<2>定位到某个位置

如果在读写文件的过程中,需要从另外一个位置进行操作的话,可以使用seek()

seek(offset, from)有2个参数

  • offset:偏移量
  • from:方向
    • 0:表示文件开头
    • 1:表示当前位置
    • 2:表示文件末尾

demo:把位置设置为:从文件开头,偏移5个字节

# 打开一个已经存在的文件
    f = open("test.txt", "r")
    str = f.read(30)
    print( "读取的数据是 : ", str)

    # 查找当前位置
    position = f.tell()
    print ("当前文件位置 : ", position)

    # 重新设置位置
    f.seek(5,0)

    # 查找当前位置
    position = f.tell()
    print( "当前文件位置 : ", position)

    f.close()

demo:把位置设置为:离文件末尾,3字节处

 # 打开一个已经存在的文件
    f = open("test.txt", "r")

    # 查找当前位置
    position = f.tell()
    print ("当前文件位置 : ", position)

    # 重新设置位置
    f.seek(-3,2)

    # 读取到的数据为:文件最后3个字节数据
    str = f.read()
    print ("读取的数据是 : ", str)

    f.close()

文件的重命名、删除

有些时候,需要对文件进行重命名、删除等一些操作,python的os模块中都有这么功能

<1>文件重命名

os模块中的rename()可以完成对文件的重命名操作

rename(需要修改的文件名, 新的文件名)

  import os

    os.rename("毕业论文.txt", "毕业论文-最终版.txt")
<2>删除文件

os模块中的remove()可以完成对文件的删除操作

remove(待删除的文件名)

    import os

    os.remove("毕业论文.txt")

文件夹的相关操作

实际开发中,有时需要用程序的方式对文件夹进行一定的操作,比如创建、删除等

就像对文件操作需要os模块一样,如果要操作文件夹,同样需要os模块

<1>创建文件夹

    import os

    os.mkdir("张三")

<2>获取当前目录

 import os

 os.getcwd()

<3>改变默认目录

import os

os.chdir("../")

<4>获取目录列表

import os

os.listdir("./")

<5>删除文件夹

import os

os.rmdir("张三")

函数

函数定义和调用

<1>定义函数

定义函数的格式如下:

  def 函数名():
        代码

demo:

   # 定义一个函数,能够完成打印信息的功能
    def printInfo():
        print'------------------------------------'print'         人生苦短,我用Python'print'------------------------------------'

<2>调用函数

定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它

调用函数很简单的,通过 函数名() 即可完成调用

demo:

    # 定义完函数后,函数是不会自动执行的,需要调用它才可以
    print (Info())

4种函数的类型

函数根据有没有参数,有没有返回值,可以相互组合,一共有4种

  • 无参数,无返回值
  • 无参数,有返回值
  • 有参数,无返回值
  • 有参数,有返回值

<1>无参数,无返回值的函数

此类函数,不能接收参数,也没有返回值,一般情况下,打印提示灯类似的功能,使用这类的函数

  def printMenu():
        print('--------------------------')
        print('      xx涮涮锅 点菜系统')
        print('')
        print('  1.  羊肉涮涮锅')
        print('  2.  牛肉涮涮锅')
        print('  3.  猪肉涮涮锅')
        print('--------------------------')

无参数无返回值

<2>无参数,有返回值的函数

此类函数,不能接收参数,但是可以返回某个数据,一般情况下,像采集数据,用此类函数

  # 获取温度
    def getTemperature():

        #这里是获取温度的一些处理过程

        #为了简单起见,先模拟返回一个数据
        return 24

    temperature = getTemperature()
    print('当前的温度为:%d'%temperature)

<3>有参数,无返回值的函数

此类函数,能接收参数,但不可以返回数据,一般情况下,对某些变量设置数据而不需结果时,用此类函数

<4>有参数,有返回值的函数

此类函数,不仅能接收参数,还可以返回某个数据,一般情况下,像数据处理并需要结果的应用,用此类函数

    # 计算1~num的累积和
    def calculateNum(num):

        result = 0
        i = 1
        while i<=num:

            result = result + i

            i+=1

        return result

    result = calculateNum(100)
    print('1~100的累积和为:%d'%result)

函数的嵌套调用

三、文件的操作、函数、类和对象第1张

  • 一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用 函数嵌套调用
  • 如果函数A中,调用了另外一个函数B,那么先把函数B中的任务都执行完毕之后才会回到上次 函数A执行的位置

局部变量

  • 局部变量,就是在函数内部定义的变量
  • 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
  • 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用

全局变量

  • 在函数外边定义的变量叫做全局变量
  • 全局变量能够在所有的如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。函数中进行访问
  • 如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错
  • 如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的。
  • 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。
  • 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量

 递归函数

如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。

匿名函数

用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤。

lambda函数的语法只包含一个语句,如下:

    lambda [arg1 [,arg2,.....argn]]:expression

如下实例:

 sum = lambda arg1, arg2: arg1 + arg2

    #调用sum函数
    print "Value of total : ", sum( 10, 20 )
    print "Value of total : ", sum( 20, 20 )

以上实例输出结果:

    Value of total :  30
    Value of total :  40

定义类

定义一个类,格式如下:

class 类名:
    方法列表

demo:定义一个Car类

# 定义类
class Car:
    # 方法
    def getCarInfo(self):
        print('车轮子个数:%d, 颜色%s'%(self.wheelNum, self.color))

    def move(self):
        print("车正在移动...")
  • 定义类时有2种:新式类和经典类,上面的Car为经典类,如果是Car(object)则为新式类
  • 类名 的命名规则按照"大驼峰"

创建对象

创建对象的格式为:

对象名 = 类名()
三、文件的操作、函数、类和对象第2张

__init__()方法

使用方式

def 类名:
    #初始化函数,用来完成一些默认的设定
    def __init__():
        pass
  • __init__()方法,在创建一个对象时默认被调用,不需要手动调用
  • __init__(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)
  • __init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去

__str__()方法

class Car:

    def __init__(self, newWheelNum, newColor):
        self.wheelNum = newWheelNum
        self.color = newColor

    def __str__(self):
        msg = "嘿。。。我的颜色是" + self.color + "我有" + int(self.wheelNum) + "个轮胎..."
        return msg

    def move(self):
        print('车在跑,目标:夏威夷')


BMW = Car(4, "白色")
print(BMW)
  • 在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
  • 当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据

self

  • 所谓的self,可以理解为自己
  • 可以把self当做C++中类里面的this指针一样理解,就是对象自身的意思
  • 某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可 

一个飞机大战的雏形(用到了pygame,挺好学的,学累了可以用它弄点自己简单的小游戏。练练Python的基本语法)

  1 #coding=utf-8
  2 import time
  3 import random
  4 import pygame
  5 from pygame.locals import *
  6 
  7 
  8 class HeroPlane(object):
  9 
 10     def __init__(self,screen):
 11 
 12         #设置飞机默认的位置
 13         self.x = 230
 14         self.y = 600
 15 
 16         #设置要显示内容的窗口
 17         self.screen = screen
 18 
 19         self.imageName = "./feiji/hero.gif"
 20         self.image = pygame.image.load(self.imageName).convert()
 21 
 22         #用来存储英雄飞机发射的所有子弹
 23         self.bulletList = []
 24 
 25     def display(self):
 26         #更新飞机的位置
 27         self.screen.blit(self.image,(self.x,self.y))
 28 
 29         #判断一下子弹的位置是否越界,如果是,那么就要删除这颗子弹
 30         #
 31         #这种方法会漏掉很多需要删除的数据
 32         # for i in self.bulletList:
 33         #     if i.y<0:
 34         #         self.bulletList.remove(i)
 35 
 36         #存放需要删除的对象信息
 37         needDelItemList = []
 38 
 39         for i in self.bulletList:
 40             if i.judge():
 41                 needDelItemList.append(i)
 42 
 43         for i in needDelItemList:
 44             self.bulletList.remove(i)
 45 
 46         # del needDelItemList
 47 
 48         #更新及这架飞机发射出的所有子弹的位置
 49         for bullet in self.bulletList:
 50             bullet.display()
 51             bullet.move()
 52 
 53         #修改所有子弹的位置
 54         # for bullet in self.bulletList:
 55         #     bullet.y -= 2
 56 
 57     def moveLeft(self):
 58         self.x -= 10
 59 
 60     def moveRight(self):
 61         self.x += 10
 62 
 63     def sheBullet(self):
 64         newBullet = Bullet(self.x,self.y,self.screen)
 65         self.bulletList.append(newBullet)
 66 
 67 class Bullet(object):
 68     def __init__(self,x,y,screen):
 69         self.x = x+40
 70         self.y = y-20
 71         self.screen = screen
 72         self.image = pygame.image.load("./feiji/bullet-3.gif").convert()
 73 
 74     def move(self):
 75         self.y -= 2
 76 
 77     def display(self):
 78         self.screen.blit(self.image,(self.x,self.y))
 79 
 80     def judge(self):
 81         if self.y<0:
 82             return True
 83         else:
 84             return False
 85 
 86 class EnemyPlane(object):
 87 
 88     def __init__(self,screen):
 89 
 90         #设置飞机默认的位置
 91         self.x = 0
 92         self.y = 0
 93 
 94         #设置要显示内容的窗口
 95         self.screen = screen
 96 
 97         self.imageName = "./feiji/enemy-1.gif"
 98         self.image = pygame.image.load(self.imageName).convert()
 99 
100         #用来存储敌人飞机发射的所有子弹
101         self.bulletList = []
102 
103         self.direction = "right"
104 
105     def display(self):
106         #更新飞机的位置
107         self.screen.blit(self.image,(self.x,self.y))
108 
109         #判断一下子弹的位置是否越界,如果是,那么就要删除这颗子弹
110         #
111         #这种方法会漏掉很多需要删除的数据
112         # for i in self.bulletList:
113         #     if i.y<0:
114         #         self.bulletList.remove(i)
115 
116         #存放需要删除的对象信息
117         needDelItemList = []
118 
119         for i in self.bulletList:
120             if i.judge():
121                 needDelItemList.append(i)
122         for i in needDelItemList:
123             self.bulletList.remove(i)
124 
125         # del needDelItemList
126 
127         #更新及这架飞机发射出的所有子弹的位置
128         for bullet in self.bulletList:
129             bullet.display()
130             bullet.move()
131 
132 
133     def move(self):
134 
135         #如果碰到了右边的边界,那么就往左走,如果碰到了左边的边界,那么就往右走
136         if self.direction == "right":
137             self.x += 2
138         elif self.direction == "left":
139             self.x -= 2
140 
141         if self.x>480-50:
142             self.direction = "left"
143         elif self.x<0:
144             self.direction = "right"
145 
146     def sheBullet(self):
147         num = random.randint(1,100)
148         if num == 88:
149             newBullet = EnemyBullet(self.x,self.y,self.screen)
150             self.bulletList.append(newBullet)
151 
152 class EnemyBullet(object):
153     def __init__(self,x,y,screen):
154         self.x = x+30
155         self.y = y+30
156         self.screen = screen
157         self.image = pygame.image.load("./feiji/bullet-1.gif").convert()
158 
159     def move(self):
160         self.y += 2
161 
162     def display(self):
163         self.screen.blit(self.image,(self.x,self.y))
164 
165     def judge(self):
166         if self.y>890:
167             return True
168         else:
169             return False
170 
171 
172 if __name__ == "__main__":
173 
174     #1. 创建一个窗口,用来显示内容
175     screen = pygame.display.set_mode((480,890),0,32)
176 
177     #2. 创建一个和窗口大小的图片,用来充当背景
178     background = pygame.image.load("./feiji/background.png").convert()
179 
180     #3. 创建一个飞机对象
181     heroPlane = HeroPlane(screen)
182 
183     #4. 创建一个敌人飞机
184     enemyPlane = EnemyPlane(screen)
185 
186     #3. 把背景图片放到窗口中显示
187     while True:
188         screen.blit(background,(0,0))
189 
190         heroPlane.display()
191 
192         enemyPlane.move()
193         enemyPlane.sheBullet()
194         enemyPlane.display()
195 
196         #判断是否是点击了退出按钮
197         for event in pygame.event.get():
198             # print(event.type)
199             if event.type == QUIT:
200                 print("exit")
201                 exit()
202             elif event.type == KEYDOWN:
203                 if event.key == K_a or event.key == K_LEFT:
204                     print('left')
205                     heroPlane.moveLeft()
206                     #控制飞机让其向左移动
207                 elif event.key == K_d or event.key == K_RIGHT:
208                     print('right')
209                     heroPlane.moveRight()
210                 elif event.key == K_SPACE:
211                     print("space")
212                     heroPlane.sheBullet()
213 
214         #通过延时的方式,来降低这个while循环的循环速度,从而降低了cpu占用率
215         time.sleep(0.01)
216 
217         pygame.display.update()

 三、文件的操作、函数、类和对象第3张

免责声明:文章转载自《三、文件的操作、函数、类和对象》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇spring5 源码深度解析----- AOP代理的生成Android(1.5) 开机图片/文字/动画 修改下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

二十、异常捕获及处理详解

代码中被[]包含的表示可选,|符号分开的表示可选其一。 需求背景 我们在写存储过程的时候,可能会出现下列一些情况: 插入的数据违反唯一约束,导致插入失败 插入或者更新数据超过字段最大长度,导致操作失败 update影响行数和期望结果不一致 遇到上面各种异常情况的时,可能需要我们能够捕获,然后可能需要回滚当前事务。 本文主要围绕异常处理这块做详细的介绍。...

mysql备份与还原

一、备份常用操作基本命令 1、备份命令mysqldump格式    格式:mysqldump -h主机名  -P端口 -u用户名 -p密码 –database 数据库名 > 文件名.sql  2、备份MySQL数据库为带删除表的格式 备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。 mysqldump  -...

oracle查询数据中包含字段替换其他内容

有个需求,三个页面类型的表单调用同一个数据表(反馈、计划、汇总三大类),为了区分三大类,我在表单加了反馈类型字段。 计划表单手动维护,反馈表单的时候,自动填充数据(需要查询计划表单维护的数据,反馈类型是计划了,但是现在是做反馈表单) 通过sql的函数replace,实现查询的时候如果是计划的,替换成反馈汉字,这样查询的数据返回表单是反馈类型了,用户维护其...

【转帖】在SQL Server中如何获得刚插入一条新记录的自动ID号

转自http://blog.csdn.net/wangji163163/archive/2008/05/09/2424191.aspx 在SQL Server中如何获得刚插入一条新记录的自动ID号收藏 ---------------------------------------------------------------  使用[IDENT_C...

select的限制

/*一、select实现并发服务器并发的两点限制 1、一个进能够打开的最大文件描述符限制。可以通过两种方式修改 ulimit -n :获取最大文件描述符个数 ulimit -n 2048:修改为2048个另外可以通过以下程序修改,利用 setrlimit 不能改父进程的限制,只能改当前进程和子进程能够打开的最大文件描述符限制   int getrlimit...

[Swift]遍历集合类型(数组、集合和字典)

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://...