Python3--文件操作

一.文件操作:

(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(with能够自动关闭文件,不需要执行close方法)

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流

引入:

文件可以持久存储,但是现在类似于临时的一些文件,不需要持久存储,如一些临时的二维码,这个不需要持久存储,但是却需要短时间内大量读取,这时候还是只能保存在文件里吗?

1.stringIO:

创建IO操作:

import io
myio = io.StringIO()
myio.write('今天天气不好')
myio.getvalue()    # 读取
# 此操作在内存中,未在硬盘里

写入:

import io
myio = io.StringIO()
myio.write('今天天气不好')
myio.getvalue()
# 此操作在内存中,未在硬盘里

读取:

myio.getvalue()
StringIO在内存中如同打开文件一样操作字符串,因此也有文件的很多方法
当创建的StringIO调用 close() 方法时,在内存中的数据会被丢失 

2.BytesIO

操作二进制(一般用于处理图片)

import io
my_byte_io = io.BytesIO()  #创建
my_byte_io.write(b'hello') #写入
print(my_byte_io.getvalue()) #读取
BytesIO 和 StringIO 类似,但是BytesIO操作的是 Bytes数据

四.常用工具

1.OS 操作系统交互

  • 直接调用系统命令
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模块中找方法

2.shutil   高级文件操作

shutil 模块提供了许多关于文件和文件集合的高级操作
  • 移动文件
    shutil.move
  • 复制文件夹
    shutil.copytree
  • 删除文件夹
    shutil.rmtre


练习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

你可能感兴趣的:(Python)