1.什么是文件
示例如下:
2.文件的作用
大家应该听说过一句话:“好记性不如烂笔头”。
不仅人的大脑会遗忘事情,计算机也会如此,比如一个程序在运行过程中用了九牛二虎之力终于计算出了结果,试想一下如果不把这些数据存放起来,相比重启电脑之后,“哭都没地方哭了”
可见,在把数据存储起来有做么大的价值
使用文件的目的:就是把一些存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力
文件的打开与关闭
想一想:如果想用word编写一份简历,应该有哪些流程呢?打开word软件,新建一个word文件
写入个人简历信息
保存文件
关闭word软件
同样,在操作文件的整体过程与使用word编写一份简历的过程是很相似的打开文件,或者新建立一个文件
读/写数据
关闭文件
1.打开文件
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
open(文件路径,访问模式)
示例如下:
f = open('test.txt', 'w')
说明:
文件路径
文件的路径分为相对路径和绝对路径两种。绝对路径:指的是绝对位置,完整地描述了目标的所在地,所有目录层级关系是一目了然的。例如:C:/Users/chris/AppData/Local/Programs/Python/Python37/python.exe,从电脑的盘符开始,表示的就是一个绝对路径。
相对路径:是从当前文件所在的文件夹开始的路径。test.txt,是在当前文件夹查找 test.txt 文件
./test.txt,也是在当前文件夹里查找test.txt文件, ./ 表示的是当前文件夹。
../test.txt,从当前文件夹的上一级文件夹里查找 test.txt 文件。 ../ 表示的是上一级文件夹
demo/test.txt,在当前文件夹里查找 demo这个文件夹,并在这个文件夹里查找 test.txt文件。
访问模式:
2.关闭文件
close( )
示例如下:
# 新建一个文件,文件名为:test.txt
f = open('test.txt', 'w')
# 关闭这个文件
f.close()
文件的读写
1.写数据(write)
使用write()可以完成向文件写入数据
demo: 新建一个文件 file_write_test.py,向其中写入如下代码:
f = open('test.txt', 'w')
f.write('hello world, i am here!\n' * 5)
f.close()
运行之后会在file_write_test.py文件所在的路径中创建一个文件test.txt,并写入内容,运行效果显示如下:
注意:如果文件不存在,那么创建;如果存在那么就先清空,然后写入数据
2.读数据(read)
使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据
demo: 新建一个文件file_read_test.py,向其中写入如下代码:
f = open('test.txt', 'r')
content = f.read(5) # 最多读取5个数据
print(content)
print("-"*30) # 分割线,用来测试
content = f.read() # 从上次读取的位置继续读取剩下的所有的数据
print(content)
f.close() # 关闭文件,这个可是个好习惯哦
运行现象:
hello
------------------------------
world, i am here!
注意:如果用open打开文件时,如果使用的"r",那么可以省略 open('test.txt')
3.读数据(readline)
readline只用来读取一行数据。
f = open('test.txt', 'r')
content = f.readline()
print("1:%s" % content)
content = f.readline()
print("2:%s" % content)
f.close()
4.读数据(readlines)
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行为列表的一个元素。
f = open('test.txt', 'r')
content = f.readlines()
print(type(content))
for temp in content:
print(temp)
f.close()
指针定位tell() 方法用来显示当前指针的位置
f = open('test.txt') print(f.read(10)) # read 指定读取的字节数 print(f.tell()) # tell()方法显示当前文件指针所在的文字 f.close()
seek(offset,whence) 方法用来重新设定指针的位置。offset:表示偏移量
whence:只能传入012中的一个数字。0表示从文件头开始
1表示从当前位置开始
2 表示从文件的末尾开始
f = open('test.txt','rb') # 需要指定打开模式为rb,只读二进制模式 print(f.read(3)) print(f.tell()) f.seek(2,0) # 从文件的开头开始,跳过两个字节 print(f.read()) f.seek(1,1) # 从当前位置开始,跳过一个字节 print(f.read()) f.seek(-4,2) # 从文件末尾开始,往前跳过四个字节 print(f.read()) f.close()
应用:制作文件的备份
任务描述输入文件的名字,然后程序自动完成对文件进行备份
参考代码
# 提示输入文件
file_name = input("请输入要拷贝的文件名字:")
# 以读的方式打开文件
old_file = open(file_name, 'rb')
# 分割文件名和后缀名
file_names =file_name.rsplit('.', maxsplit=1)
# 组织新的文件名字
new_file_name = file_names[0] + '.bak.'+file_names[1]
# 创建新文件
newFile = open(new_file_name, 'wb')
# 把旧文件中的数据,一行一行的进行复制到新文件中
for lineContent in old_file.readlines():
newFile.write(lineContent)
# 关闭文件
old_file.close()
newFile.close()
异常的概念
程序在运行过程中,由于我们的编码不规范,或者其他原因一些客观原因,导致我们的程序无法继续运行,此时,程序就会出现异常。如果我们不对异常进行处理,程序可能会由于异常直接中断掉。为了保证程序的健壮性,我们在程序设计里提出了异常处理这个概念。
本次只是让大家初步体验一下异常,以及异常的简单处理,后续关于异常,我们还会再次深入学习。
读取文件异常
在读取一个文件时,如果这个文件不存在,则会报出FileNotFoundError错误。
程序在运行过程中会经常遇到类似的异常,如果我们不进行处理,此时程序就会中断并退出。为了提高程序的健壮性,我们可以使用异常处理机制来解决程序运行过程中可能出现的问题。
try...except语句
try...except语句可以对代码运行过程中可能出现的异常进行处理。 语法结构:
try:
可能会出现异常的代码块
except 异常的类型:
出现异常以后的处理语句
示例:
try:
f = open('test.txt', 'r')
print(f.read())
except FileNotFoundError:
print('文件没有找到,请检查文件名称是否正确')
练习:
让用户任意输入两个数字,再让用户选择算数运算符,最后让用户输入的两个数字进行算数运算,并输出结果。 要求:如果用户输入的内容不是数字,需要提示用户重新输入
如果用户做了除以0的操作,提示用户不能除以0
参考代码:
def get_num(msg):
num = input(msg)
try:
num = float(num)
except ValueError:
print("您输入的数字不合法,请重新输入")
get_num(msg)
else:
return num
def get_operator():
operator = input('请选择运算符\n 1:加法 2:减法 3:乘法 4:除法 \n')
if operator != '1' and operator != '2' and operator != '3' and operator != '4':
get_operator()
else:
return operator
def do_cal(a, b, p):
if p == '1':
return a + b
elif p == '2':
return a - b
elif p == '3':
return a * b
elif p == '4':
try:
result = a / b
except ZeroDivisionError:
return '对不起,除数不能为0'
else:
return result
else:
return '对不起,不支持的运算符'
while True:
num1 = get_num("请输入一个数字\n")
num2 = get_num('请再输入一个数字\n')
operator = get_operator()
result = do_cal(num1, num2, operator)
print('计算的结果是:{}'.format(result))
print('#############################')
内置模块的使用
Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。这些模块提供了丰富的功能,可以直接使用相应的模块来快速实现相应的功能。
下面我们就介绍一些工作中常见的模块:random模块
math模块
os模块
time模块
datetime模块
calendar模块
不管是使用哪个内置模块,都需要先使用关键字 import 将相应的模块先行导入才能使用。
random模块
random 模块主要用于生成随机数或者从一个列表里随机获取数据。
print(random.random()) # 生成 [0,1)的随机浮点数
print(random.uniform(20, 30)) # 生成[20,30]的随机浮点数
print(random.randint(10, 30)) # 生成[10,30]的随机整数
print(random.randrange(20, 30)) # 生成[20,30)的随机整数
print(random.choice('abcdefg')) # 从列表里随机取出一个元素
print(random.sample('abcdefghij', 3)) # 从列表里随机取出指定个数的元素
math模块
math模块保存了数学计算相关的方法,可以很方便的实现数学运算。
import math
print(math.fabs(-100)) # 取绝对值
print(math.ceil(34.01)) #向上取整
print(math.factorial(5)) # 计算阶乘
print(math.floor(34.98)) # 向下取整
print(math.pi) # π的值,约等于 3.141592653589793
print(math.pow(2, 10)) # 2的10次方
print(math.sin(math.pi / 6)) # 正弦值
print(math.cos(math.pi / 3)) # 余弦值
print(math.tan(math.pi / 2)) # 正切值
OS模块
在Python开发中,经常会涉及到大量的文件和路径操作,此时就需要使用os模块。
import os
os.getcwd() # 获取当前的工作目录,即当前python脚本工作的目录
os.chdir('test') # 改变当前脚本工作目录,相当于shell下的cd命令
os.rename('毕业论文.txt','毕业论文-最终版.txt') # 文件重命名
os.remove('毕业论文.txt') # 删除文件
os.rmdir('demo') # 删除空文件夹
os.removedirs('demo') # 删除空文件夹
os.mkdir('demo') # 创建一个文件夹
os.chdir('C:\\') # 切换工作目录
os.listdir('C:\\') # 列出指定目录里的所有文件和文件夹
os.name # nt->widonws posix->Linux/Unix或者MacOS
os.environ # 获取到环境配置
os.environ.get('PATH') # 获取指定的环境配置
os.path.abspath(path) # 获取Path规范会的绝对路径
os.path.exists(path) # 如果Path存在,则返回True
os.path.isdir(path) # 如果path是一个存在的目录,返回True。否则返回False
os.path.isfile(path) # 如果path是一个存在的文件,返回True。否则返回False
os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回
time模块
print(time.time()) # 获取从1970-01-01 00:00:00 UTC 到现在时间的秒数
print(time.strftime("%Y-%m-%d %H:%M:%S")) # 按照指定格式输出时间
print(time.asctime()) #Mon Apr 15 20:03:23 2019
print(time.ctime()) # Mon Apr 15 20:03:23 2019
print('hello')
print(time.sleep(10)) # 让线程暂停10秒钟
print('world')
datetime模块
print(datetime.datetime.now()) # 2019-04-15 20:09:05.190113
print(datetime.datetime.now().replace(year=2020)) # 2020-04-15 20:12:37.832657
print(datetime.datetime.now()+datetime.timedelta(weeks=1)) # 2019-04-22 20:11:56.399726
calendar模块
calendar.setfirstweekday(calendar.SUNDAY) # 设置每周起始日期码。周一到周日分别对应 0 ~ 6
calendar.firstweekday()# 返回当前每周起始日期的设置。默认情况下,首次载入calendar模块时返回0,即星期一。
c = calendar.calendar(2019) # 生成2019年的日历,并且以周日为其实日期码
print(c) #打印2019年日历
print(calendar.isleap(2000)) # True.闰年返回True,否则返回False
count = calendar.leapdays(1996,2010) # 获取1996年到2010年一共有多少个闰年
print(calendar.month(2019, 3)) # 打印2019年3月的日历