6. IO及文件操作

import语句

先看一个示例:

import math

r=5
print('半径为5的圆的面积为:%.2f'%(math.pi*r**2))
D:\Python\python.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:\Python\python.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:\Python\python.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:\Python\python.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
3.141592653589793
import math
print(pi)

D:\Python\python.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:\Python\python.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:\Python\python.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
3.141592653589793

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

from math import pi as p
print(p)

D:\Python\python.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:\Python\python.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
d:/test.txt

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

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

D:\Python\python.exe D:/Work/Tools/python_workspace/python_2017/class_basic/temp3.py
./test.txt

执行完程序后,到D:\Work\Tools\python_workspace\python_2017\class_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:\Python\python.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:\Python\python.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() 方法不会在字符串结尾添加换行符(’\n’),语法如下:

fileObject.write(string)

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

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

D:\Python\python.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:\Python\python.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:\Python\python.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中,用 \n 表示换行。

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('\nwelcome!'))
f_name=open(path,'r')
print('read result:',f_name.read())
D:\Python\python.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将文件名和扩展名分开,返回文件路径和文件扩展名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值