12.1 open()

open()函数作用是打开文件,返回一个文件对象。

用法格式:open(name[, mode[, buffering[,encoding]]]) -> file object
name 文件名
mode 模式,比如以只读方式打开
buffering 缓冲区
encoding 返回数据采用的什么编码,一般utf8或gbk
Mode
Description
r
只读,默认
w
只写,打开前清空文件内容
a
追加
a+
读写,写到文件末尾
w+
可读写,清空文件内容
r+
可读写,能写到文件任何位置
rb
二进制模式读
wb
二进制模式写,清空文件内容
例如:打开一个文件
>>> f = open('test.txt', 'r')
>>> f.
f.__class__(         f.__new__(           f.encoding           f.readinto(
f.__delattr__(       f.__reduce__(        f.errors             f.readline(
f.__doc__            f.__reduce_ex__(     f.fileno(            f.readlines(
f.__enter__(         f.__repr__(          f.flush(             f.seek(
f.__exit__(          f.__setattr__(       f.isatty(            f.softspace
f.__format__(        f.__sizeof__(        f.mode               f.tell(
f.__getattribute__(  f.__str__(           f.name               f.truncate(
f.__hash__(          f.__subclasshook__(  f.newlines           f.write(
f.__init__(          f.close(             f.next(              f.writelines(
f.__iter__(          f.closed             f.read(              f.xreadlines(

open()函数打开文件返回一个文件对象,并赋予遍历f,f就拥有了这个文件对象的操作方法。
方法
描述
f.read([size])
读取size字节,当未指定或给负值时,读取剩余所有的字节,作为字符串返回
f.readline([size])
从文件中读取下一行,作为字符串返回。如果指定size则返回size字节
f.readlines([size])
读取size字节,当未指定或给负值时,读取剩余所有的字节,作为列表返回
f.write(str)
写字符串到文件
f.writelines(seq)
写序列到文件,seq必须是一个可迭代对象,而且要是一个字符串序列
f.seek(offset[, whence=0])
在文件中移动文件指针,从whence(0代表文件起始位置,默认。1代表当前位置。2代表文件末尾)偏移offset个字节
f.tell()
返回当前在文件中的位置
f.close()
关闭文件
f.flush
刷新缓冲区到磁盘

博客地址:http://lizhenliang.blog.51cto.com and https://yq.aliyun.com/u/lizhenliang
QQ群:323779636(Shell/Python运维开发群)
12.2 文件对象操作
写一个测试文件test.txt举例:
# cat test.txt
1.Python
2.Java
3.C++
4.Ruby

12.2.1 read()读取所有内容
>>> f = open('test.txt', 'r')
>>> f.read()
'1.Python\n2.Java\n3.C++\n4.Ruby\n'
# 获取指定字节

 指定读取多少字节:
>>> f = open('test.txt', 'r')
>>> f.read(9)
'1.Python\n'

12.2.2 readline()读取下一行内容
>>> f = open('test.txt', 'r')
>>> f.readline()
'1.Python\n'
>>> f.readline()
'2.Java\n'

12.2.3 readlines()读取所有内容返回一个列表
>>> f = open('test.txt', 'r')
>>> f.readlines()
['1.Python\n', '2.Java\n', '3.C++\n', '4.Ruby\n']

12.2.4 wirte()写入字符串到文件
>>> f = open('test.txt', 'a')  # 以追加方式打开文件
>>> f.write("5.Shell\n")  # 这一步并没有真正写到文件
>>> f.flush()  # 刷新到磁盘才写到文件
# cat test.txt
1.Python
2.Java
3.C++
4.Ruby
5.Shell

12.2.5 wirtelines()写入一个序列字符串到文件
>>> f = open('test.txt', 'a')
>>> f.writelines(['a','b','c'])
>>> f.flush()
# cat test.txt
1.Python
2.Java
3.C++
4.Ruby
5.Shell
abc

12.2.6 seek()从指定位置读取
>>> f = open('test.txt', 'r')
>>> f.tell()
0
>>> f.seek(9)
>>> f.tell()
9
>>> f.seek(5,1)  # 1表示从当前位置开始
>>> f.tell()
14

12.2.7 tell()返回当前指针位置
>>> f = open('test.txt', 'r')
>>> f.tell()
0
>>> f.readline()
'1.Python\n'
>>> f.tell()   
9
>>> f.readline()
'2.Java\n'
>>> f.tell()   
16
>>> f.close()  # 使用完后关闭文件

12.3 文件对象增删改查
在shell中,我们要想对文件指定行插入内容、替换等情况,使用sed工具很容易就实现。在本章节讲的open()函数并没有直接类似与sed工具的方法,要想实现这样的操作,变通的处理能到达此效果,主要思路是先读取内容修改,再写会文件,以下举几个常用的情况 。
12.3.1 在第一行增加一行
例如:在开头添加一个test字符串
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data = f.read()
data = "test\n" + data
f = open('test.txt', 'w')
f.write(data)
f.flush()
f.close()
# python test.py
# cat test.txt
test
1.Python
2.Java
3.C++
4.Ruby

先将数据读出来,然后把要添加的test字符串拼接到原有的数据,然后在写入这个文件。
12.3.2 在指定行添加一行
例如:在第二行添加一个test字符串
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data_list = f.readlines()  # 经测试,此方法比下面迭代效率高
# data_list = []
# for line in f:
#     data_list.append(line)
data_list.insert(1, 'test\n')
# data = ''.join(data)
f = open('test.txt', 'w')
# f.write(data)
f.writelines(data_list)  
f.flush()
f.close
# python test.py
# cat test.txt
1.Python
test
2.Java
3.C++
4.Ruby

先将数据以列表存储,就可以根据下标插入到指定位置,也就是哪一行了。再通过join把列表拼接成字符串,最后写到文件。
12.3.3 在匹配行前一行或后一行添加test字符串
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data_list = f.readlines()
data_list.insert(2-1, 'test\n')  # 在指定行减去一行就是上一行了,下一行插入同理
f = open('test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close

12.3.4 删除指定行
例如:删除第三行,与在指定行添加同理
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data_list = f.readlines()
data_list.pop(2)
f = open('test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close

例如:只保留第一行至第三行
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data_list = f.readlines()[0:2]  # 列表切片
f = open('test.txt', 'w')
f.write(data_list)
f.flush()
f.close

12.3.5 删除匹配行
例如:删除匹配Py字符的行
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data = f.readlines()
# data_list = []
# for line in data:
#     if line.find('Py') == -1:   # 如果当前行不包含Py字符,会返回-1,否则返回下标
#         data_list.append(line)
data_list = [line for line in data if line.find('Py') == -1]  
f = open('test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close

12.3.6 全局替换字符串
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data = f.read()
data.replace('old string', 'new string')
f = open('test.txt', 'w')
f.write(data)
f.flush()
f.close

12.3.7 在指定行替换字符串
例如:将C++改为C#
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt', 'r')
data = f.readlines()
data_list = []
for line in data:
    if data.index(line) == 2:
        data_list.append(line.replace('++', '#'))
    else:
        data_list.append(line)
f = open('test.txt', 'w')
f.writelines(data_list)
f.flush()
f.close

12.3.8 处理大文件
在读取上G文件时,直接读取所有内容会导致内存占用过多,内存爆掉。要想提高处理效率,有以下两种方法:
方法1:open()打开文件返回的对象本身就是可迭代的,利用for循环迭代可提高处理性能
>>> f = open('test.txt')
>>> for line in f:
...   print line   # 每行后面会有一个换行符\n,所以会打印出来换行符,可以使用line.strip('\n')去除
...
1.Python
2.Java
3.C++
4.Ruby

方法2:每次只读取固定字节
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt')
while True:
    data = f.read(1024)  # 每次只读取1024字节
    if not data: break

12.3.9 下载文件
方法1:
import urllib
url = "http://nginx.org/download/nginx-1.10.1.tar.gz"
urllib.urlretrieve(url, "nginx-1.10.1.tar.gz")
 
方法2:
import urllib2
url = "http://nginx.org/download/nginx-1.10.1.tar.gz"
f = urllib2.urlopen(url).read()
with open("nginx-1.10.1.tar.gz", "wb") as data:
    data.write(f)

12.4 fileinput
fileinput模块是Python内建模块,用于遍历文件,可对多文件操作。
方法
描述
fileinput.input([files[, inplace[, backup[, mode[, openhook]]]]])
files:文件路径,多文件这样写['1.txt,'2.txt'']
inplace:是否将标准输出写到原文件,默认是0,不写
backup:备份文件扩展名,比如.bak
mode:读写模式,默认r,只读
openhook:
fileinput.isfirstline()
检查当前行是否是文件的第一行
fileinput.lineno()
返回当前已经读取行的数量
fileinput.fileno()
返回当前文件数量
fileinput.filelineno()
返回当前读取行的行号
fileinput.filename()
返回当前文件名
12.4.1 遍历文件内容
#!/usr/bin/python
# -*- coding: utf-8 -*-
import fileinput
for line in fileinput.input('test.txt'):
print line
# python test.py 
1.Python
2.Java
3.C++
4.Ruby

12.4.2 返回当前读取行的行号
#!/usr/bin/python
# -*- coding: utf-8 -*-
import fileinput
for line in fileinput.input('test.txt'):
print fileinput.filelineno()
print line,  # 逗号忽略换行符
# python test.py
1
1.Python
2
2.Java
3
3.C++
4
4.Ruby

12.4.3 全局替换字符,修改原文件
#!/usr/bin/python
# -*- coding: utf-8 -*-
import fileinput
for line in fileinput.input('test.txt', backup='.bak', inplace=1):
line = line.replace('++','#')
print line,

先把要操作的文件备份一个以.bak的后缀文件,inplace=1是将标准输出写到原文件,也就是这个脚本如果没有标准输出,就会以空数据写到原文件。
12.4.4 对多文件操作
#!/usr/bin/python
# -*- coding: utf-8 -*-
import fileinput
for line in fileinput.input(['test.txt', 'test2.txt']):
    print line,

12.4.5 实时读取文件新增内容,类似tail -f
#!/usr/bin/python
# -*- coding: utf-8 -*-
with open('access.log') as f:
f.seek(0,2)   # 每次打开文件都将文件指针移动到末尾
while True:  
line = f.readline()
if line:
print line,

这个死循环会一直执行下面的操作。很消耗性能。
我们可以加个休眠,每秒读取一次:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
with open('access.log') as f:
     f.seek(0,2)
     while True:
         line = f.readline()
         if line:
             print line,
         else:
             time.sleep(1)

12.5 shutil
shutil模块是Python内建模块,用于文件或目录拷贝,归档。
方法
描述
shutil.copyfile(src, dst)
复制文件
shutil.copytree(src, dst)
复制文件或目录
shutil.move(src, dst)
移动文件或目录
shutil.rmtree(path,ignore_errors=False, οnerrοr=None)
递归删除目录。os.rmdir()不能删除有文件的目录,就可以用这个了
shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None)
Python2.7以后才有这个方法。
功能是创建zip或tar归档文件。
base_name:要创建归档文件名
format:归档文件格式,有zip、tar、bztar、gztar
root_dir:要压缩的目录
base_dir:?
用法:shutil.make_archive('wp','zip','/root/wordpress')   
12.6 with语句
在处理一些事务时,可能会出现异常和后续的清理工作,比如读取失败,关闭文件等。这就用到了异常处理语句try...except,如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
f = open('test.txt')
try:
data = f.read()
finally:
f.close()

Python对于这种情况提供了一种更简单的处理方式,with语句。处理一个文件时,先获取一个文件句柄,再从文件中读取数据,最后关闭文件句柄。如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
with open('test.txt') as f:
data = f.read()

转自

第十二章 Python文件操作-云栖社区-阿里云 https://yq.aliyun.com/articles/64777?spm=a2c4e.11155435.0.0.54a15d013hSThj

转载于:https://www.cnblogs.com/paul8339/p/11133711.html

第十二章 Python文件操作【转】相关推荐

  1. 二十二、Python文件操作

    目录 什么是文件? 文件概念: 文件类型: 加码解码 文件的基本操作 打开文件 open() 判断文件编码-chardet模块 打开方式-mode 读取文件fp.read() 关闭文件 fp.clos ...

  2. 十二章 Python入门系列之字典

    系列文章目录 第一章 Python入门系列之介绍 第二章 Python入门系列之PyCharm 第三章 Python入门系列之注释 第四章 Python入门系列之变量 第五章 Python入门系列之输 ...

  3. WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(下)

    使用消息队列 消息队列是本书WCF异步技术中的最后一个出场的.消息队列可以为消息传输提供持久性.可靠性和事务性.甚至,发送消息的客户端程序与接受消息的服务可以不必同时运行.但使用该灵活性需要付出一定的 ...

  4. 平均成绩计算机控件,计算机技术基础(第十二章 文件 )

    功能:包括文件的创建(打开).复制.移动.删除及获取与文件有关的信息. 可以使用FileSystemObject对象和File对象完成文件管理工作. 管理文件的部分属性和方法:P229-230表12- ...

  5. WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(上)

    当客户端程序调用一个单向操作后,客户端可以继续运行而不用等待服务完成该操作.你可以通过操作合约指定单向操作行为.达到该目的的最简单方式是在当以操作时设置Operation-Contract特性类的Is ...

  6. 第十二章 实现单向操作和异步操作(上)

    当客户端程序调用一个单向操作后,客户端可以继续运行而不用等待服务完成该操作.你可以通过操作合约指定单向操作行为.达到该目的的最简单方式是在当以操作时设置Operation-Contract特性类的Is ...

  7. WCF 4.0 进阶系列 – 第十二章 实现单向操作和异步操作(中)

    单向操作特别适用于"触发然后忘记"场景,在该场景中,客户端程序并不期望服务回传任何信息.但是,许多操作并不适用于这种情况,其向客户端程序返回数据.为了处理这些情况,WCF支持异步操 ...

  8. python 宝典 笔记 第十二章 存储数据和对象 (各种对象转换成字符串)

    第十二章 存储数据和对象 12.1数据存储概述 12.1.1文本与二进制对比 文本格式易于阅读和调试,跨平台性能好.二进制格式占用空间小,适于按记录存取. 12.1.2压缩 假如对象的大小开始成为问题 ...

  9. 【JAVA SE】第十二章 流(Stream)、IO流和文件(File)

    第十二章 流(Stream).IO和文件(File) 文章目录 第十二章 流(Stream).IO和文件(File) 一.流(Stream) 1.什么是流 2.流的分类 二.IO流 1.字节输入流(I ...

最新文章

  1. shell脚本将命令的输出结果赋值给变量
  2. SAP MM 预制发票相关的Function Modules
  3. 让VC程序在Win7下获得管理员权限
  4. c#url拼接方法名_c# 获取url参数的五种方法
  5. 同批号不同批次同一单据中出现数量不限制
  6. 【POJ - 3468 】 A Simple Problem with Integers (线段树模板 区间更新 + 区间和查询)(不能树状数组或差分数组)
  7. python报错cannot import name ‘BeautifulSoup‘ from ‘bs4‘
  8. 4位格雷码的顺序编码_八位格雷码转换器.doc
  9. 0基础学python要多久-零基础零经验自学Python,到精通Python要多久啊?
  10. c语言 内存清除函数,C语言内存初始化函数MEMSET的用法
  11. Radon变换——MATLAB
  12. 判断登陆权限的操作,登录后调到之前所操作的地址。
  13. Node连接MySql数据库写模糊查询接口
  14. sqli-labs(18-22)
  15. java实现低碳生活大奖赛
  16. oracle安装使用
  17. PyTorch faster_rcnn之一源码解读一
  18. 使用map_server保存并使用已有地图
  19. java实现PDF转tif(图片清晰度高)
  20. [经验]Class MediaTransCoder is implemented in both One of the two will be used. Which one is undefined

热门文章

  1. javascript参考资料
  2. SpringCloud项目搭建步骤
  3. 给家里的笔记本换了一个风扇。明显噪音就变小了,而且散热也变好了
  4. 中文简繁体互转时的语义识别AI
  5. android xUtils 2.6.14 jar 下载 使用 和混淆
  6. springboot集成普罗米修斯
  7. Adobe Firefly萤火虫试用版功能介绍
  8. 内蒙古计算机教师职称评定条件,内蒙古自治区中小学教师职称评审办法出台
  9. 移动办公必不可少的APP,来自办公达人的分享
  10. 用vs2019使用C#连接MySQL创建图书管理系统(1-7)源码集,未优化,未美化