• 6. IO及文件操作


    import语句

    先看一个示例:

    import math
    
    r=5
    print('半径为5的圆的面积为:%.2f'%(math.pi*r**2))
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    半径为5的圆的面积为:78.54
    

    上面的程序使用了import语句。
    import math的意思是从python标准库中引入math.py模块,这是python中定义的引入模块的方法。import的标准语法如下:

    import module1[,module2][,...moduleN]
    

    表示允许一个import导入多个模块,但各个模块之间要用逗号隔开。
    当解释器遇到import语句时,如果模块在当前搜索路径就会被导入。搜索路径是一个解释器,会先搜索所有目录的列表。
    查看搜索路径的方式:

    import sys
    
    print('python当前的搜索路径是:%s'%sys.path)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    python当前的搜索路径是:['D:\Work\Tools\python_workspace\python_2017\class_basic', 'D:\Work\Tools\python_workspace\python_2017', 'D:\Python\python37.zip', 'D:\Python\DLLs', 'D:\Python\lib', 'D:\Python', 'D:\Python\lib\site-packages']
    

    由以上输出结果看到,sys.path输出了一个列表,第一项输出的是执行文件的目录,即我们执行python解释器的目录(如果是脚本,就是运行脚本所在的目录)。
    下面我们引入一些不在搜索路径中的模块:

    from math import pi
    print(pi)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    3.141592653589793
    

    上面的操作中使用了from math import pi的方式,这是什么意思呢?
    在Python中,from语句可以从模块中导入指定部分到当前命名空间中,语法如下:

    from modname import name1[,name2][,...nameN]
    

    例如,from math import pi语句就是从math模块中导入pi到当前命名空间,该语句不会将math模块整个导入。math函数中其他函数都使用不了。
    如果导入模块,就会得到该模块中所有对象;如果指定导入某个对象,就只能得到该对象。

    import math
    print(math.pi)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    3.141592653589793
    
    import math
    print(pi)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    Traceback (most recent call last):
      File "D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py", line 4, in <module>
        print(pi)
    NameError: name 'pi' is not defined
    
    from math import pi
    print(pi)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    3.141592653589793
    

    由上面的输出结果可以看到,如果在导入math模块时访问pi对象,需要使用math.pi,直接使用pi访问不了,会报错。使用import语句后,可以直接访问pi对象。
    如果要访问模块中多个对象,是否需要一个个导入呢?不需要:

    from math import pi,sin,...,N
    

    可以从一个导入语句导入多个函数,多个函数之间用逗号分割。
    如果要访问模块中多个对象,是否需要一个个导入呢?当然不用:

    from math import *
    

    使用该语句可以将math中所有对象都引入,这是一个简单的将项目中所有模块都引入的方法。在实际开发中,这种声明不建议过多使用,这样不利于编写简单、清晰的代码。只有想从给定模块导入所有功能时才使用这种方式。
    出了上述几种方式外,还可以为模块取别名:

    import math as m
    print(m.pi)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    3.141592653589793
    

    给模块取别名的方式为:在导入模块的语句末尾增加一个 ad 子句,后跟上别名名称。
    既然可以为模块取别名,当然也可以为函数取别名:

    from math import pi as p
    print(p)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    3.141592653589793
    

    文件操作

    运行程序时,用变量保存数据是一个比较通用的方法。如果希望程序结束后数据仍然能够保存,就不能使用变量保存数据了,需要寻求其他方式保存数据,文件就是一个不错的选择。在程序运行过程中将数据保存到文件,程序运行结束后,相关数据就保存到文件中了。这就涉及到文件的操作。

    打开文件

    在python中,打开文件使用的是open函数。open函数基本语法如下:

    open(file_name[,access_mode][,buffering])
    

    【参数解析】

    • file_name变量:是一个包含要访问的文件名称的字符串值。
    • access_mode变量:指打开文件的模式,对应有只读、写入、追加等。该变量值不是必须的(不带access_mode变量时,要求file_name存在,否则报异常),默认文件访问模式为只读(r)。
    • buffering:如果buffering的值被设为0,就不会有寄存;值取1,访问文件时就会寄存行;值设为大于1的整数,表示就是寄存区的缓冲大小;如果取负值,寄存区的缓冲大小就是系统默认的值。

    open函数返回一个File(文件)对象。File对象代表计算机中的一个文件,是python中的另一种类型的值,就像我们熟悉的列表和字典。

    path='d:/test.txt'
    f_name=open(path)
    print(f_name.name)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    d:/test.txt
    

    执行结果告诉我们打开的是d盘下的test.txt文件(执行该程序前,已创建该文件)。

    • 文件路径:文件在计算机上的位置。
    • 绝对路径:总是从根文件夹开始。
    • 相对路径:相对于程序当前工作目录的路径。比如当前工作文件存放路径是D:pythonworkspace,如果使用相对路径,就可以不写这个路径,用一个“.”号代替这个路径值。
    path='./test.txt'
    f_name=open(path,'w')
    print(f_name.name)
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    ./test.txt
    

    执行完程序后,到D:WorkToolspython_workspacepython_2017class_basic路径下查看,可以看到创建了一个名为test.txtde 文件。
    除了单个点,还可以用两个点(…)表示父文件夹(上一级文件夹)。

    文件模式

    模式 描述
    t 文本模式 (默认)。
    x 写模式,新建一个文件,如果该文件已存在则会报错。
    b 二进制模式。
    + 打开一个文件进行更新(可读可写)。
    U 通用换行模式(不推荐)。
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
    w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
    • 使用open函数时,明确指定读模式和什么模式都不指定的效果是一样的。
    • 使用写模式可以向文件写入内容。+参数可以用到其他任何模式中,指明读和写都是允许的。比如w+可以在打开一个文件时用于文件的读写。
    • 当参数带上字母b时,表示可以用来读取一个二进制文件。
    读和写

    open函数返回的是一个file对象,有了file对象,就可以开始读取内容。如果希望将整个文件的内容读取为一个字符串值,可以使用file对象的read()方法。
    read()方法是从一个打开的文件中读取字符串。注意,python字符串可以是二进制数据,而不是仅仅是文字。

    fileObject.read([count])
    

    fileObject 为open函数返回的file对象,count参数是从已打开的文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,就会尝试尽可能多地读取内容,很可能一直读取到文件末尾。
    比如我们在test.txt文件中写入“Hello world!Welcome!”,执行如下代码:

    path='./test.txt'
    f_name=open(path,'r')
    print('read result:',f_name.read(12))
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    read result: Hello world!
    

    由执行结果可以看到,通过read方法我们读取了文件中从头开始的12个字符串。

    当不传入count值:

    path='./test.txt'
    f_name=open(path,'r')
    print('read result:',f_name.read())
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    read result: Hello world!Welcome!
    

    不传入count值的时候,read方法会读取打开文件的所有字节。
    出了读取数据外,我们还可以向文件中写入数据。如果打开文件时使用读模式,就不能写入文件,即不能用下面这种形式操作文件:

    open(path,'rw')
    

    在python中,用write() 方法向一个文件写入数据。write() 方法可将任何字符串写入一个打开的文件。
    write() 方法不会在字符串结尾添加换行符(’ ’),语法如下:

    fileObject.write(string)
    

    fileObject 为open函数返回的File对象,string参数是需要写入文件中的内容。
    该方法返回写入文件的字符串的长度。

    path='./test.txt'
    f_name=open(path,'w')
    print('write length:',f_name.write('Hello World!'))
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    write length: 12
    

    由执行结果可以看到,我们向text.txt文件中写入了12个字符。下面验证一下写入的是否使我们指定的字符,在上面的程序中追加两行代码并执行:

    path='./test.txt'
    f_name=open(path,'w')
    print('write length:',f_name.write('Hello World!'))
    
    f_name=open(path,'r')
    print('read result:',f_name.read())
    
    执行结果:
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    write length: 12
    read result: Hello World!
    

    由执行结果可以看到,写入文件的使我们指定的内容。但是,我们在这里执行了两次写入操作,为什么得到的结果只写入了一次?
    write() 方法的处理方式是:将覆写原有文件,从头开始,每次写入都会覆盖前面所有内容,就像用一个新值覆盖一个变量的值。若需要在当前文件的字符串后面追加字符,该怎么办呢?
    可以将第二个参数 w 更换为 a ,即以追加模式打开文件:

    path='./test.txt'
    f_name=open(path,'w')
    print('write length:',f_name.write('Hello World!'))
    f_name=open(path,'r')
    print('read result:',f_name.read())
    
    f_name=open(path,'a')
    print('add length:',f_name.write('welcome!'))
    f_name=open(path,'r')
    print('read result:',f_name.read())
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    write length: 12
    read result: Hello World!
    add length: 8
    read result: Hello World!welcome!
    

    由执行结果看到,输出结果在文件末尾成功添加了指定字符串。

    • 如果传递给open函数的文件名不存在,写模式(w)和追加模式(a)就会创建一个新的空文件,然后执行写入或追加。

    如果想追加的字符串在下一行,该怎么办呢?
    python中,用 表示换行。

    path='./test.txt'
    f_name=open(path,'w')
    print('write length:',f_name.write('Hello World!'))
    f_name=open(path,'r')
    print('read result:',f_name.read())
    
    f_name=open(path,'a')
    print('add length:',f_name.write('
    welcome!'))
    f_name=open(path,'r')
    print('read result:',f_name.read())
    
    D:Pythonpython.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
    write length: 12
    read result: Hello World!
    add length: 9
    read result: Hello World!
    welcome!
    

    由执行结果可知,后面追加的内容在下一行了。

    关闭文件

    一般情况下,一个文件对象在退出程序后会自动关闭,但是为了安全起见,还是要显示地写一个close方法关闭文件:

    path='./test.txt'
    f_name=open(path,'w')
    print('write length:',f_name.write('Hello World!'))
    f_name.close()
    

    这段代码和没有加close方法的执行结果一样。这样处理后的函数比没有加close方法时更安全,可以避免在某些操作系统或设置中进行无用的修改,也可以避免用完系统中所打开文件的配额。
    对内容更改过的文件一定要记得关闭,因为写入的数据可能被缓存,如果程序或系统因为某些原因崩溃,被缓存部分数据就不会写入文件了。为了安全起见,在使用完文件后一定要记得关闭。

    OS模块

    os 模块提供了非常丰富的方法用来处理文件和目录。常用方法如下:

    方法 描述
    os.getcwd 返回当前工作目录,只具体到路径,不具体到文件
    os.path.realpath(path) 返回path的真实路径,如果参数是__file__就说明是本文件所在的绝对路径。
    os.path.join(path1[, path2[, …]]) 把目录和文件名合成一个路径
    os.mkdir(path[, mode]) 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。
    os.rmdir(path) 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。
    os.remove(path) 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError;
    os.listdir(path) 用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 ‘.’ 和’…’ 即使它在文件夹中。
    os.path.isdir 判断路径是否为目录,返回布尔值
    os.path.isfile 判断路径是否为文件,返回布尔值
    os.path.split 拆分路径,返回文件的路径和文件名
    os.path.splitext 将文件名和扩展名分开,返回文件路径和文件扩展名
  • 相关阅读:
    rabbitmq在centos7下安装
    跨域问题
    11生成器相关及推导式(附内置函数分析图url)
    10函数名的应用,闭包,和迭代器
    09函数的动态传参及global和nonlocal关键字
    08函数简介
    07基本的文件操作
    06set集合和深浅拷贝(包括前面的一些知识点补充)
    05判断和编码/解码
    04基本数据类型(字典)
  • 原文地址:https://www.cnblogs.com/xiaotufei/p/13338454.html
Copyright © 2020-2023  润新知