zoukankan      html  css  js  c++  java
  • 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 将文件名和扩展名分开,返回文件路径和文件扩展名
  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/xiaotufei/p/13338454.html
Copyright © 2011-2022 走看看