文件
一、文件的基本操作
思考一:我们之前已经学会了基本输入和输出,已经学会如何把内容输出到屏幕上,那还有没有其他的输出途径呢?
思考二:现在要想把计算的结果永久保存下来该怎么办呢?
- 文件的打开
file_one = open('test.txt','w')
打开文件使用open函数
第一个参数:打开的文件
第二个参数:打开模式,默认只读(r)打开
常用的模式有:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式 |
w | 打开一个文件只用于写入,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除,如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加,如果该文件已经存在,文件指针将会放在文件的末尾,也就是说,新的内容将会被写入到已有内容之后,如果该文件不存在,创建新文件进行写入 |
b | 二进制模式 |
+ | 打开一个文件进行更新(可读可写) |
r+ | 打开一个文件用于读写,文件指针将会被放在文件的开头 |
w+ | 打开一个文件用于读写,如果该文件已经存在则打开文件,并从开头开始编辑,即原有内容会被删除,如果该文件不存在,创建新文件 |
a+ | 打开一个文件用于读写,如果该文件已存在,文件指针将会放在文件的结尾,文件打开时会是追加模式,如果该文件不存在,创建新文件用于读写 |
rb | 以二进制格式打开一个文件用于只读,文件指针将会放在文件的开头,这是默认模式,一般用于非文件如图片等 |
wb | 以二进制格式打开一个文件只用于写入,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除,如果该文件不存在,创建新文件,一般用于非文本文件如图片等 |
ab | 以二进格式打开一个文件用于追加,如果文件已存在,文件指针将会放在文件的结尾,也就是说,新的内容将会被写入到已有内容之后,如果该文件不存在,创建新文件进行写入 |
- 文件的写入
file_one.write('this is test file')
写文件直接调用write方法,write方法每次只可以接受一个参数
file_one.writelines(['hello python\n','I heart you\n','day day up\n'])
如果你想要一次写入多个内容,那就需要使用writelines
- 文件的关闭
file_one.flush()
文件最开始写入会写入到内存中,只有调用flush刷新到硬盘中才能保存到文件
file_one.close()
关闭文件也会自动保存修改到文件中
- 文件的读取
file_one = open('text.txt','r+')
如果只读文件,最好就用只读模式打开
file_one.read()
读取文件内容调用read方法即可
file_one.tell()
当文件读取之后,可以调用tell方法查看文件中指针的位置
file_one.seek(0)
当指针在末尾时读取不出内容,需要把指针移动到文件开头
file_one.readline()
file_one.readlines()
我们也可以使用readline或readlines来读取一行多所有行内容
- 文件的读取
with open('test.txt') as f:
file = f.readline()
while file:
print(file)
file = f.readline()
每次打开文件都需要再次关闭,但是如果使用with可以自动关闭文件,不需要手动关闭
记下来我们一一举例子:
f = open('test.txt','r')
运行以后报错,因为没有这个文件存在,而且他也不会创建
f = open('test.txt','w')
f.write('hello python')
f.close()
运行之后如下
f = open('test.txt','w')
f.writelines(['ok!\n','my name is xy\n','what is your name?'])
运行之后如下,已经把之前的覆盖掉了
f = open('test.txt','a')
f.write('aaaaa')
f.close()
看下使用a参数的效果:
我们现在进行读写
f = open ('test.txt','r')
tt = f.read()
print(tt)
f.close()
运行之后如下,但是没有任何输出,这是为什么呢
f = open('test2.txt','w+')
运行之后如下,可以打印出来,因为我们加了f.seek(0)使他的指针到最开始,这样才能读到文件
f = open('test2.txt','a+')
f.write('\nl like pyton\nday day up !!!')
f.seek(0)
tt = f.readlines()
print(tt)
f.close()
运行之后如下,f.readlines()是读取全部以列表的形式返回
再要注意的一个就是编码格式,因为我们文件中可能会写入中文
f = open('test3.txt','w')
f.write('祖国强大')
f.close()
我们先写一个文件,然后读出来
f = open('test3.txt','r')
tt = f.read()
print(tt)
f.close()
他会出现乱码,所以必须加上编码格式如下
f = open('test3.txt','r',encoding = ’utf-8')
tt = f.read()
print(tt)
f.close()
with open('test4.txt','a+',encoding='utf-8') as f:
f.writelines(['今天什么天气\n','今天下雨了\n','出门需要打伞'])
f.seek(0)
file = f.readline()
while file:
print(file)
file = f.readline()
运行如下
-
总结
1、文件的打开
掌握:open函数的使用方法
2、文件的写入
掌握:write、writelines方法
3、文件的读取
掌握:read、readlines、readline方法
4、文件的关闭
掌握:close、with方法
二、文件流思考一:刚才讲的永久的文件存储,那如果文件需要快速大量的读取呢?
import io
string_io = io.StringIO()
在内存中打开一个文件流,如同打开一个文件
文件流有getvalue方法可以获取内容
BytesIO和StringIO类似,区别是内容都是二进制的字符串
主要用来存储图像、音频、视频等·
简单来说文件流就是临时打开一个文件,你可以写进去东西,然后也可以读出来
三、文件目录操作
思考一:刚才我们是对单个文件的操作,如果我们需要对文件所在的文件目录操作该怎么做呢?
-
文件目录操作
也支持对文件目录的操作
还有以下方法:
makedires 创建多层目录
remove 移动文件
rmdir 删除目录
removedirs 删除多层目录
system 调用系统命令
walk 遍历文件夹
os.path 路径操作
四、模块和包思考一:刚才介绍了文件的相关操作,可以去读取文件内容,如果现在需要引入一个文佳中的代码,应该怎么做呢?
-
模块
import datetime
对于一个py文件,可以只用import来导入其中的代码
Python中的模块,指的就是一个py文件
- 模块的导入
import datetime
from datetime import datetime as dt
用import来导入整个模块
使用from来导入部分内容
as可以给导入的内容来重新命名
- 路径的添加
import sys
sys.path
使用sys.path来查看模块的查找路径
如果要添加其他的路径,只需要使用:
sys.path.append(path)将路径添加列表即可
import sys
print('not in main')
if __name__ == '__main__':
print('in main')
print(sys.argv)
__name__代表模块的名字
__main__当模块直接运行时的文件名
当文件被导入时,if判断返回False
sys.argv 获取参数传入
- 包
import json
所谓的包,就是存放多个模块的文件夹
Python中的包,值得就是一个py文件夹
-
包管理
1、init.py可以设置包的信息,比如:__all__设置外界可以查看的包的方法
2、包内的模块相互导入使用:from .module/…module import obj(as new_name)
3、模块出现相对路径导入,则只可以被导入,不能直接运行 -
总结
1、模块
理解:模块即py文件
2、sys
掌握:sys模块的使用
掌握:模块的导入
3、包
理解:包的概念
4、包管理
掌握:包管理中的__init__和相对路径导入
五、本节课总结
1、文件
掌握:文件的打开、关闭、读写
2、文件流
了解:文件流
3、文件目录操作
了解:文件目录的创建、修改
4、模块和包
掌握:模块和包的导入
掌握:相对路径的导入
六、上节课作业参考代码如下
1、一个列表由四个元组组成,每个元组都是四个数字组成,现在要求对这个列表排序排序规则是按照每个元组的第二个元素大小排序
li = [(1,2,3,4),(2,5,8,9),(9,8,7,6),(6,1,4,5)]
li.sort(key = lambda x: x[1])
print(li)
2、实现isPrime()函数,参数是整数,如果整数是质数
返回True,否则返回False
def isPrime(a):
if str(a).isdigit == False:
return Fasle
elif a <= 1:
return False
elif a == 2:
return False
else:
for i in range(2,a):
if a % i == 0:
return False
return True
3、利用递归函数,实现一个阶乘函数,支持正数和负数的阶乘
def factorial(n):
if n == 0:
return 1
elif n > 0:
return n * factorial(n-1)
else:
return n * factorial(n+1)
4、定义一个函数,输入字符串,如果字符串是顺序的则返回‘UP’
如果是倒序的则返回‘DOWN’, 如果是乱序的则返回False
def up_down(x):
if x == ''.join(sorted(x)):
return 'UP'
elif x == ''.join(sorted(x,reverse=True)):
return 'DOWN'
else:
return False
七、本次作业
1、利用datetime模块,批量生成6月份每天的txt文件
2、生成上面的文件之后,再一次在每个文件中写入文件名
3、将上面生成的所有文件名之后加上‘_NEW’
4、假设有一个英文文本文件,编写一个程序读取其内容,并将里面的大写字母变成小写字母,小写字母变成大写字母(字符串swapcase方法)
下次参考代码见