Python文件操作

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')  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值