1、掌握Python文件操作
系统环境
- Linux Ubuntu 14.04
- Python 3.6
- Ipython
- PyCharm
本实验共包含open()函数、文件对象操作、文件对象增删改查、fileinput模块、shutil模块
实验步骤
open()函数:打开文件,返回一个文件对象
用法格式:open(name[, mode[, buffering[,encoding]]]) -> file object
name 文件名
mode 模式,比如以只读方式打开
buffering 缓冲区
encoding 返回数据采用的什么编码,一般utf8或gbk
1.示例:以只读的方式打开/data/test.txt文件(test.txt文件需提前创建)
在Python解释器中输入" f. ",并按tab键,可以看到open()函数自带的方法
open()函数打开文件返回一个文件对象,并赋予遍历f,f就拥有了这个文件对象的操作方法。
文件对象操作:
1.使用read()方法读取/data/test.txt文件所有内容
2.指定读取多少字节
3.使用readline()方法读取下一行内容
4.使用readlines()方法读取所有内容返回一个列表
5.使用wirte()方法写入字符串到/data/test.txt文件
# 以追加方式打开文件
f = open('/data/test.txt','a')
# 这一步并没有真正写到文件
f.write('flink\n')
# 刷新到磁盘才写到文件
f.flush()
在shell命令行下,使用cat命令查看/data/test.txt文件
cat /data/test.txt
6.使用writelines()方法写入一个序列字符串到文件
f = open('/data/test.txt','a')
f.writelines(['a','b','c\n'])
f.flush()
在shell命令行下,使用cat命令查看/data/test.txt文件
cat /data/test.txt
7.使用seek()方法在/data/test.txt文件中移动文件指针,并使用tell()方法返回当前指针位置
#使用二进制模式读取/data/test.txt文件
f = open('/data/test.txt','rb')
#返回当前文件指针位置
f.tell()
#移动文件指针,偏移3个字节
f.seek(3)
#返回当前文件指针位置
f.tell()
#从当前位置(3)向后偏移4个字节
f.seek(4,1)
文件对象增删改查:
在shell中,我们要想对文件进行指定行插入内容、替换等情况,使用sed工具很容易就实现。open()函数并没有直接类似与sed工具的方法,要想实现这样的操作,主要思路是先读取内容、修改、再写回文件,以下举几个常用的情况:
8.在文件开头增加一行
#以只读的方式打开/data/test.txt文件
f = open('/data/test.txt', 'r')
#读取文件内容并赋值给data
data = f.read()
#修改data变量,开头加上test
data = "test\n" + data
#以写入方式打开/data/test.txt文件
f = open('/data/test.txt', 'w')
#将data中的内容写入文件
f.write(data)
#刷新缓冲区到磁盘
f.flush()
#关闭文件
f.close()
在shell命令行下,查看/data/test.txt文件
cat /data/test.txt
9.在指定行增加一行
#以只读的方式打开/data/test.txt文件
f = open('/data/test.txt', 'r')
#读取文件到列表中
data_list = f.readlines()
#向第二行插入一行数据,test2
data_list.insert(1, 'test2\n')
#以写入的方式打开/data/test.txt文件
f = open('/data/test.txt', 'w')
#将data_list序列化到test.txt文件
f.writelines(data_list)
#刷新缓冲区到磁盘
f.flush()
#关闭文件
f.close
在shell命令行下,查看/data/test.txt文件
cat /data/test.txt
10.删除指定行
f = open('/data/test.txt', 'r')
data_list = f.readlines()
#删除文件中的第二行
data_list.pop(1)
f = open('/data/test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close
在shell命令行下,查看/data/test.txt文件
cat /data/test.txt
11.删除匹配行
f = open('/data/test.txt', 'r')
data = f.readlines()
#删除py开头的行
data_list = [line for line in data if line.find('py') == -1]
f = open('/data/test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close
在shell命令行下,查看/data/test.txt文件
cat /data/test.txt
12.只保留第二行到第四行
f = open('/data/test.txt', 'r')
data_list = f.readlines()[1:4] #列表切片
f = open('/data/test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close
在shell命令行下,查看/data/test.txt文件
cat /data/test.txt
13.全局替换字符串
f = open('/data/test.txt', 'r')
data = f.read()
#将java替换成javaee
data1 = data.replace('java', 'javaee')
f = open('/data/test.txt', 'w')
f.write(data1)
f.flush()
f.close
在shell命令行下,查看/data/test.txt文件
cat /data/test.txt
14.在指定行替换字符串
f = open('/data/test.txt', 'r')
data = f.readlines()
data_list = []
for line in data:
if data.index(line) == 1:
data_list.append(line.replace('spark', 'Spark'))
else:
data_list.append(line)
#以写入的方式打开/data/test.py文件
#此处注意多敲两行回车,确定结束for循环后,开始输入以下代码
f = open('/data/test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close
15.处理大文件
在读取上G文件时,直接读取所有内容会导致内存占用过多,内存爆掉。
我们介绍以下两种提高处理效率方法:
方法1:open()打开文件返回的对象本身就是可迭代的,利用for循环迭代可提高处理性能
方法2:每次只读取固定字节
fileinput模块:Python的内建模块,用于遍历文件,可对多文件操作。
16.遍历文件内容:
17.返回当前读取行的行号
18.全局替换字符
import fileinput
#先将文件备份一份后缀为.bak的文件,inplace=1是将标准输出写到原文件
#没有标准输出会将空数据写到原文件
for line in fileinput.input('/data/test.txt', backup='.bak', inplace=1):
#将全局hadoop替换为Hadoop
line = line.replace('hadoop','Hadoop')
print (line,end='')
shutil模块:Python的内建模块,用于文件或目录拷贝,归档。
19.复制/data/test.txt文件,文件名为test3.txt
import shutil
shutil.copyfile('/data/test.txt','/data/test3.txt')