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


    一、文件

    文件的打开与关闭

    在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)

    函数的嵌套调用

    • 一个函数里面又调用了另外一个函数,这就是所谓的函数嵌套调用 函数嵌套调用
    • 如果函数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)则为新式类
    • 类名 的命名规则按照"大驼峰"

    创建对象

    创建对象的格式为:

    对象名 = 类名()

    __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()

     

  • 相关阅读:
    Quartz.net任务调度
    基于Task定时检测网络本地网络状况
    java基于NIO的分散读取文件,然后统一聚合后写入文件
    基于直接缓冲区和非直接缓冲区的javaIO文件操作
    java 读取xml
    WPF 通过线程使用ProcessBar
    NPOI自适应列宽
    C#序列化与反序列化以及深拷贝浅拷贝
    Springboot feign 传递request信息
    apereo cas 小记01--服务器搭建01
  • 原文地址:https://www.cnblogs.com/jiangzijiang/p/8503330.html
Copyright © 2020-2023  润新知