(1)打开文件,得到文件句柄并赋值给一个变量
(2)通过句柄对文件进行操作
(3)关闭文件
1.打开文件open(文件存在则打开文件,文件不存在则创建文件)
path = 'test.txt' # 文件与当前py文件处于同一目录
path = r'/home/pyvip/py_case/text.txt' # 文件与当前py文件处于同一目录(从其他文件夹下访问其他文件要从根目录下写)
file = open(path, 'r') # 打开文件 参数r为读取
file.read() # 读取文件返回值为文件内容
打开文件的模式有:
r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
"+" 表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】
w+,写读
a+,同a
"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)
rU
r+U
"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)
rb
wb
ab
2.写入文件f.write--会覆盖文件原有内容
file = open('test.txt','w') # 打开文件 参数w为可写,但写完会覆盖原有内容
file.write('今天天气不错') # 写入
file.close() # 关闭文件,此时文件内容为:今天天气不错
3.文件的读取与关闭
file.read() # 读取全部内容
file.readline() # 读取一行
file.readlines() # 一行保存为一个元素,组成一个列表
file.close()
# 注文件open()后,必须close()
想要阅读前5行怎么办呢?要一行一行的file.readline()吗?
Absolutly No
一个简单的for循环就可以搞定啦~
f = open('test.txt','r')
for i in range(5):
print(f.readline())
我又不想打印第10行怎么办呢?
(此种办法效率低:一次性把文件读出来,再循环,效率低;读小文件可以,不适用于读较大文件)
f = open('test.txt','r')
for index,line in enumerate(f.readlines()):
if index == 9:
print('-----')
continue
print(line.strip())
我们可以这样做~取一行读一行,内存中也只保存一行,效率高
f = open('test.txt','r')
count = 0
for line in f:
if count == 9:
print('-----')
count += 1
continue
print(line)
count += 1
4.查看
file=open('test.txt','r')
file.tell() # 返回此时光标的位置(查看指针)
file.readline() # 读取一行
file.seek(0) # 将文件光标移动到起始位置
file.seek(70) # 将文件光标移动到70的位置,
5.f.flush()--刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入
import sys,time
for i in range(20):
sys.stdout.write('###')
sys.stdout.flush()#如果不加flush,会直接一下读取出来,而不是一个个打印出来,刷新内部缓冲的作用
time.sleep(0.1)
运行结果:像进度条一样,一个#一个#的打印出来,打印20个
6.f.truncate()--截断
从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。
f =open('test.txt','a')
f.truncate(10)
f.close()
f =open('test.txt','r')
print(f.read())
#运行结果:
Somehow, i #原句是:Somehow, it seems the love I knew was always the most destructive kind
无size:
f =open('test.txt','a')
f.seek(20)
f.truncate()
f.close()
f =open('test.txt','r')
print(f.read())
#运行结果
Somehow, it seems th #原句是:Somehow, it seems the love I knew was always the most destructive kind
序号 | 方法及描述 |
---|---|
1 | file.close() 关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | file.next() 返回文件下一行。 |
6 | file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | file.readline([size]) 读取整行,包括 "\n" 字符。 |
8 | file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 | file.seek(offset[, whence]) 设置文件当前位置 |
10 | file.tell() 返回文件当前位置。 |
11 | file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
12 | file.write(str) 将字符串写入文件,没有返回值。 |
13 | file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
with open('test.txt','r') as file:
print(file.read())
# 例:
from datetime import datetime
class RunTime(object):
def __enter__(self):
self.start_time = datetime.now()
print(self.start_time)
return self.start_time
def __exit__(self, exc_type, exc_val, exc_tb):
self.end_time = datetime.now()
print(self.end_time)
print('运行时间为: %s' % (self.end_time - self.start_time))
run = RunTime()
with run as a:
for i in range(200):
type('hello')
# 运行结果:
2018-04-18 01:47:34.042769
2018-04-18 01:47:34.043882
运行时间为: 0:00:00.001113
# 通过这两个方法可以方便的实现上下文管理
with 会把 __enter__的返回值赋值给as后的变量
以后敲代码用with,避免直接使用open()
文件可以持久存储,但是现在类似于临时的一些文件,不需要持久存储,如一些临时的二维码,这个不需要持久存储,但是却需要短时间内大量读取,这时候还是只能保存在文件里吗?
创建IO操作:
import io
myio = io.StringIO()
myio.write('今天天气不好')
myio.getvalue() # 读取
# 此操作在内存中,未在硬盘里
写入:
import io
myio = io.StringIO()
myio.write('今天天气不好')
myio.getvalue()
# 此操作在内存中,未在硬盘里
读取:
myio.getvalue()
StringIO在内存中如同打开文件一样操作字符串,因此也有文件的很多方法
操作二进制(一般用于处理图片)
import io
my_byte_io = io.BytesIO() #创建
my_byte_io.write(b'hello') #写入
print(my_byte_io.getvalue()) #读取
BytesIO 和 StringIO 类似,但是BytesIO操作的是 Bytes数据
import os
os.system('ls')
os.system('cat test.txt')
import os
os.path
os.path.join('pyvip','hch','hello') # 拼接路径
os.mkdir('py_case2')
os.rename('py_case2','py_case_del') # 重命名
import os
os.mkdir('test')
os.rename('test', 'test1')
os 提供了Python和操作系统交互方式,只要是和操作系统相关,就可以尝试在os模块中找方法
练习1:
根据上下文管理器,判断IO操作和文件操作那个速度快
from datetime import datetime
import io
class RunTime(object):
def __enter__(self):
self.start_time = datetime.now()
print(self.start_time)
return self.start_time
def __exit__(self, exc_type, exc_val, exc_tb):
self.end_time = datetime.now()
print(self.end_time)
print('运行时间为: %s' % (self.end_time - self.start_time))
sio = io.StringIO()
sio.write('今天天气真好')
with RunTime() as a:
with open('duqusucai.py', 'r') as file:
print(file.read())
with RunTime() as b:
print(sio.getvalue())
# 运行结果:
2018-04-18 02:58:20.221762
今天天气真好
2018-04-18 02:58:20.228967
运行时间为: 0:00:00.007205
2018-04-18 02:58:20.229365
今天天气真好
2018-04-18 02:58:20.229521
运行时间为: 0:00:00.000156