Python文件操作详解
Python内置了一个open()方法,用于对本地文件进行读写操作。这个功能简单、实用,属于必须掌握的基础知识。
使用open方法操作文件可以分三步走,一是打开文件,二是操作文件,三是关闭文件。下面分别介绍:
一、打开文件
其基本语法:f = open('文件名','打开模式')
打开模式:
r 只读 默认模式,如果文件不存在就报错,存在就正常读取。
w 只写 如果文件不存在,新建文件,然后写入;如果存在,先清空文件内容,再写入。
a 追加 如果文件不存在,新建文件,然后写入;如果存在,在文件的最后追加写入。
x 只写 如果文件存在则报错,如果不存在就新建文件,然后写入内容,比w模式更安全。python3以上新增。
+ 读写模式 比如r+ w+ a+ (下文详细说明)
b 二进制模式 比如rb wb ab 这个和bytes类型、字符串类型有关系(下文详细说明)
还有r+b w+b a+b的组合模式,不在一一列举
特别强调:
1. b模式:二进制模式,也就是01010101之类的比特流。需要特别注意,它在读写的时候是以字节类型(bytes)读写的,因此获得的是一个字节对象而不是字符串。在这个读写过程中,需要自己指定字节类型的编码格式。以write()方法为例进行说明,read()方法也是同样的。
s = 'this is a test'
b = bytes(s,encoding='utf-8')
f = open('test.txt','w')
f.write(s)
##这样没问题,正常写入了文件。
##-------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')
f = open('test.txt','wb') ##注意多了个b
f.write(s)
##报错
TypeError: a bytes-like object is required, not 'str'
##意思是它需要一个bytes类型数据,你却给了个字符串
##---------------------------------------------------
s = 'this is a test'
b = bytes(s,encoding='utf-8')
f = open('test.txt','wb') ##注意多了个b
f.write(b) ##将变量b传给它,b是个bytes类型
##成功执行!
因此,在使用带b的模式时一定要注意传入的数据类型。没有b以字符为单位进行读写,有b则以字节为单位读写。
2. +模式: 对于w+,事实上这种模式,在读写之前都会清空你文件内容,请不要使用!
对于a+模式,事实上这种模式,你永远只能在文件的末尾写入,有局限性,请不要使用!
对于r+模式,相对来说最好的读写模式,配合seek()和tell()方法,可以实现大部分操作。
二、文件操作方法
在Python3中,基本的文件操作方法有:
class TextIOWrapper(_TextIOBase):
def close(self, *args, **kwargs):
关闭文件
pass
def fileno(self, *args, **kwargs):
文件描述符
pass
def flush(self, *args, **kwargs):
刷新文件内部缓冲区
pass
def isatty(self, *args, **kwargs):
判断文件是否是同意tty设备
pass
def read(self, *args, **kwargs):
读取指定字节数据
pass
def readable(self, *args, **kwargs):
是否可读
pass
def readline(self, *args, **kwargs):
仅读取一行数据
pass
def seek(self, *args, **kwargs): #
指定文件中指针位置
pass
def seekable(self, *args, **kwargs):
指针是否可操作
pass
def tell(self, *args, **kwargs):
获取指针位置
pass
def truncate(self, *args, **kwargs):
截断数据,仅保留指定之前数据
pass
def writable(self, *args, **kwargs):
是否可写
pass
def write(self, *args, **kwargs):
写内容
pass
def __getstate__(self, *args, **kwargs):
pass
def __init__(self, *args, **kwargs):
pass
@staticmethod
def __new__(*args, **kwargs): # real signature unknown
""" Create and return a new object. See help(type) for accurate signature. """
pass
def __next__(self, *args, **kwargs):
""" Implement next(self). """
pass
def __repr__(self, *args, **kwargs):
""" Return repr(self). """
pass
buffer = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
closed = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
encoding = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
errors = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
line_buffering = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
name = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
newlines = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
_CHUNK_SIZE = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
_finalizing = property(lambda self: object(), lambda self, v: None, lambda self: None) # default
其中,真正重要的,用得着的是read、readline、readlines、write、tell、seek、flush、close这几个方法。请注意,没有直接修改文件内容的方法。下面介绍一下这几个重点方法:
1.read():可指定一次读取的数量,比如f.read(10)。如果打开模式没有b,则read的时候以字符为单位进行读取,有b则以字节为单位读取。
2.write():如果打开模式没有b,则接受普通的字符串为参数;如果有b则需要传入bytes类型的对象。
3.readline():读入一行,如果打开模式没有b,则返回一行字符串;如果有b,则返回bytes类型。可以指定数量参数。
4. readlines():将所有文件按行读入,如果打开模式没有b,则返回由各行字符串为元素组成的列表;如果有b,则返回由各行的bytes类型组成的列表。可以指定数量参数。
5.tell():在打开的文件中,维持着一个位置指针,默认刚开始处于文件的顶端,也就是0位置,在读的过程中,读走多少,指针就移动多少,并且它永远是以字节为单位进行计数。因此在使用时一定要注意编码的问题,否则容易造成读写的乱码。tell方法可以获取当前指针的位置,使用方法,f.tell()。
6.seek():将指针指向指定的下标处,与tell配合使用,单位是字节。使用方法,f.seek(5)。
7.flush():将刚写入的内容刷新到本地文件。默认情况下,在文件关闭后,缓存内的数据才会写入本地文件,这样可能会造成数据访问不一致。
三、关闭文件
为了防止资源泄露,文件破坏,在每次对文件做完操作,我们都要关闭文件。它很简单,文件句柄.close()就可以。
四、with—上下文管理器
Python的with语法非常棒,它能帮你自动关闭打开的文件,不需要你手动调用close()方法。
with的基本使用方式如下:
with open('test.txt','w') as f:
f.write('str')
而且在2.7以后的版本中,它还支持同时打开多个文件。
with open('log1') as obj1, open('log2') as obj2:
pass五、文件的迭代
当文件被打开后,可以对文件进行逐行迭代:
for line in f:
pass
Python文件操作详解的更多相关文章
- Python——文件操作详解
python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目 ...
- python/ORM操作详解
一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...
- Android的file文件操作详解
Android的file文件操作详解 android的文件操作要有权限: 判断SD卡是否插入 Environment.getExternalStorageState().equals( android ...
- python第七篇:Python 列表操作详解
Python列表操作详解 list函数 list() #生成一个空的列表 list(iterable) #用可迭代对象初始化一个列表 列表的 and 运算和 or 运算 列表and运算 > ...
- python文件读写详解
# Python3 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, ...
- Python字符串操作详解
菜鸟学Python第五天 流程控制 for循环 while循环 VS for循环: while循环:称之为条件循环,循环的次数取决于条件何时为false for循环:称之为迭代器循环,循环的次数取决于 ...
- Opencv YAML和XML格式文件操作详解
本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/47660943 本文参考Opencv 2 ...
- android中的文件操作详解以及内部存储和外部存储(转载)
原文链接:http://m.blog.csdn.net/article/details?id=17725989 摘要 其实安卓文件的操作和java在pc环境下的操作并无二致,之所以需要单独讲解是因为安 ...
- Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解
上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
随机推荐
- Ubuntu虚拟机JeOS安装-2016.08.28
根据官网的说明JeOS的镜像已经在官方不发行了,所以你在别的帖子里看到的安装jeos的镜像地址已经不适用了. 那么应该如何安装这种最小版本的linux操作系统呢? 其一,如果想要安装老版本的jeos系 ...
- EF中一对多的关系中,用单字段保存ID拼接字符串
model.SubjectTerms = model.SelectedSubjectTerm.Trim(',').Split(',').ToList().Select(x => new Subj ...
- 适合wordpress中文网站的seo优化插件 DX-Seo
DX-Seo是一款强大的多功能wordpress seo插件,主要功能及其使用方法如下 全局开关设置 启动插件后,进入"DX-Seo"栏目,你可以开启或者关闭其中的所有功能. 自动 ...
- 【面经】Epic: 数据库去重
题目是:有2个10G的数据库,存储了一些string. 2者之间有一些重复的数据.请把它们合并为一个数据库,并且去除重复. 限制:内存是4G 例如: DB1: cmu, ucb, stanford, ...
- tldr 的安卓客户端
上次在 Cheat (tldr, bropages) - Unix命令用法备忘单 这篇博文中提到过 tldr ,它跟 cheatsheet 的功能一样:用来查询一些常用命令的惯用法,呈现形式是简明扼要 ...
- 用Unity模仿CSGO里的火焰效果
CSGO里的火焰效果和真实的情况比较像,能沿着遮挡物前进,如下是模仿效果. 思路比较简单,开始想的是一圈一圈发出去,但是前圈与后圈的联系不好做,换种思路,每个方向发射一条线,这样根据上一个位置的方位先 ...
- [AX 2012] Woker user request
在HR模块和System administrator模块下都能找到Woker user request这个功能,它的作用是为员工创建一个AX账号.比如我们创建一个这样的user request: 注意 ...
- SQLServer查询执行计划分析 - 案例
SQLServer查询执行计划分析 - 案例 http://pan.baidu.com/s/1pJ0gLjP 包括学习笔记.书.样例库
- js 当前日期增加自然月
js 在日期不满足的情况下就会自动加1个月,比如在当前时间为3月31号,传入1,1两个参数,预期结果为2月29日,但是结果输出了3月2日.就是如果不满就会溢出到下个月,后来看了api发现了setMon ...
- arcgis ERROR:000824 该工具未获得许可
当时上面还说点击000824进入帮助文档,它说是由于扩展功能未勾选,于是我勾上,结果还是不行,后来它说可能是没有许可,于是我把license重新授权了一遍,结果,还是不行 其实,解决方法是在catal ...