Python开发【第六篇】:文件处理
1. 文件
文件处理流程:
- 打开文件,获得文件句柄,并赋值
- 通过句柄对文件进行操作
- 关闭文件
1.1 打开文件
在 Python 中使用 open()函数打开文件,并返回文件对象:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
open 函数有很多参数,一般地只需了解三个即可。第一个是文件对象,第二个是打开模式,第四个是编码方式。
Tips:open 函数打开文件采用的默认编码方式是系统编码,Windows 为 GBK;若打开的文件是 utf-8,那么需要指定编码方式为 utf-8,否则乱码。
文件打开模式
| 打开模式 | 说明 |
|---|---|
| r | 只读方式打开(默认) |
| x | 如果文件存在,打开引发异常 |
| b | 以二进制方式打开文件 |
| + | 可读写模式(可添加到其他模式中) |
| w | 只写方式打开,会覆盖已存在文件 |
| a | 以写入模式打开,文件存在,在末尾追加 |
| t | 以文本模式打开(默认) |
| U | 通用换行符支持 |
使用 open 函数打开一个文件,可以获得文件对象(或句柄),利用文件对象,我们就可以对文件进行读取或 修改操作:
f = open('C:\\Users\\HJ\\Desktop\\a.txt')
Tips:open 函数默认以只读模式打开文本文件,即 rt 模式,打开二进制需要 b 模式。
1.1.1 文件对象方法
打开文件后获得文件对象,利用文件对象的一些方法,我们可以对文件内容进行读取或修改。
文件对象方法
| 文件对象方法 | 说明 |
|---|---|
| read([n]) | 读取文件(全部读取),以自己为单位读取 |
| readable() | 判断文件是否可读,返回布尔值 |
| readline() | 一次读取一行,默认换行,f.readline(),end=''不换行 |
| readlines() | 读取所有内容,存成列表 |
| write(str) | 将字符串写入文件 |
| writeable() | 判断文件是否可写 |
| writelines(seq) | 写入一个序列,元素必须是字符串 |
| seek(offset,from) | 在文件中移动文件指针 |
| tell() | 返回当前在文件中的位置 |
| close() | 关闭文件 |
1.1.2 with 关键字
使用 open 函数打开文件,每次都需要关闭文件,很是麻烦。一旦没有关闭,文件就会有泄漏的风险。而 Python 为我们提供了一个关键字 with,不需要我们每次自己关闭文件,Python 内部会自动关闭。
with open('a.txt') as f: # f 即为文件对象
f.read()
打开一个文件,并将内容写入另一个文件中:
with open('a.txt', 'r', encoding='utf-8') as f1,
open('b.txt', 'w', encoding='utf-8') as f2:
data = f1.readlines() # 存为列表
f2.write(data[0]) # 只写入第一行
1.1.3 文件定位
tell()方法
read 方法以 字节读取文件,不指定参数,默认全部读取,文件指针指向文件末尾。使用 tell 方法可以查看文件指针位置。
# test_file.txt
第一行
第二行
f = open('test_file', encoding='utf-8', newline='')
data = f.readlines()
print(f.tell())
print(data)
f.close()
22
['第一行\r\n', '第二行\r\n']
文件默认不显示 \r\n,每个汉字 3 个字节,总共 6 个汉字(即 18 个字节)。再加上两个 \r\n(即 4 个字节),总计 22 个字节,显然文件指针已经指向文件末尾。
Tips:在不同系统中换行符不同,Windows 中为
\r\n,Linux 中为\n。Python 为了更好地兼容其他平台,统一转换为\n,要想查看真实的换行符,可在 open 函数中指定newline = ''
默认不显示换行符:
f = open('test_file', encoding='utf-8')
print(f.read())
print(f.tell())
第一行
第二行
22
使用 readlines()只能看到 \n:
f = open('test_file', encoding='utf-8')
print(f.readlines())
print(f.tell)
['第一行\n', '第二行\n']
22
seek()方法
文件指针即用来定位光标所在,相当于一个书签,seek()方法可以用来设置文件指针的位置,它的单位也是 字节。
seek(offset, from)
seek(3) # 移动 3 个字节
seek()有两个参数:第一个 offset 为偏移量(即偏移字节),第二个 from 表示从哪个位置开始偏移,from 为三种模式:
- 0:表示从文件开头位置偏移
- 1:表示从当前位置偏移,必须以 rb 模式打开,最后再解码
- 2:表示从文件末尾开始偏移,必须以 rb 模式打开,最后再解码
从文件开始位置偏移:
f = open('test_file', encoding='utf-8')
print(f.tell()) # 文件刚打开时位置为 0
f.seek(10, 0) # 偏移 10 个字节,即第一行 \r 的后面,那么剩下的还要 \n 和 第二行内容
print(f.tell())
print(f.read())
f.close()
0
10
第二行
从当前位置偏移:
f = open('test_file', 'rb')
f.seek(3, 0) # 移动 3 个字节
print(f.tell()) # 3 位置
f.seek(3, 1) # 在 3 位置,再移动 3 个字节
print(f.tell())
print(f.read().decode('utf-8'))
f.close()
3
6
行
第二行
首先移动 3 个字节,再移动 3 个字节,指针到了第一行内容(第一行)中一的后面,再读取后面的内容。
文件末尾偏移:
f = open('test_file', 'rb')
f.seek(-5, 2)
print(f.tell())
data = f.readlines()
print(data)
print(data[-1].decode('utf-8'))
f.close()
17
[b'\xe8\xa1\x8c\r\n'] # 二进制,需要解码
行
访问文件的两种方式
设置一个查看日志的程序(查看日志一般都是查看最新的,即文件最后位置的内容)。
方法一:
使用 readlines()方法查看,缺点是需要全部将文件读取出来,加载到内存才能读取最后一行,消耗时间和内存。
f = open('a.txt', encoding='utf-8')
data = f.readlines()
print(data[-1])
方法二:
利用 seek()方法,将文件指针移动到文件末尾,从文件末尾开始读取。
f = open('a.txt', 'rb')
for i in f:
offs = -10
while True:
f.seek(offs, 2)
data = f.readlines()
if len(data) > 1: # 大于 1 表示读了两行
print('文件最后一行是:%s' % (data[-1]).decode('utf-8'))
break
offs *= 2 # 小于 1 表示没有最后一行没有读完,再将偏移量翻倍
1.2 文件写入
写入文件必须是 w 或 a 模式打开文件,只能写入字符串,不能写入其他数据类型。
1.2.1 w、a 模式
w 模式打开文件,文件存在则覆盖原有内容,文件不存在则新建。a 模式打开文件,文件追加到文件末尾:
f = open('a.txt', 'w', encoding='utf-8')
f.write('123\n') # 要加换行
f.writelines(['45\n', '67\n']) # 写入一个列表
1.2.2 + 模式
+表示同时可以对文件进行读写操作。
| 模式 | 说明 | 模式 | 说明 |
|---|---|---|---|
| r+ | 读写 | w+ | 读写 |
| x+ | 写读 | a+ | 写读 |
1.2.3 b 模式
b 模式以字节为单位打开文件,即可打开二进制文件(包括视频、图片、音频等),打开时不能指定编码方式。
一个文件在未保存时,它是存在于内存中(字符串形式)。当要存储到硬盘上时,便需要编码成字节码(bytes),同理硬盘上的内容加载处理,需要解码(decode)成字符串(str):

# a.txt
第一行
f = open('test_file', 'rb')
data = f.read()
print(data)
print(data.decode('utf-8'))
b'\xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c\r\n\r\n'
第一行
wb 、ab模式
以二进制格式写入文件,会覆盖原文件。只能写入二进制文件,因此写入的字符串必须编码成二进制。
f = open('a.txt', 'wb')
f.write(bytes('你好\n', encoding='utf-8'))
#f.write('你好\n'。encode('utf-8'))
以上两种方式都可以写入文件,ab 末尾则是在末尾追加。
1.2.4 其他文件对象方法
f.closed():判断文件是否关闭
f.encoding:查看文件打开的编码
f.flush():刷新(每过几秒自动保存)从内存到硬盘
1.3 总结
open 函数打开文件六种模式r、r+、w、w+、a、a+的区别:
- r:只读
- r+:可读写,直接写入文件,则从文件开头开始写,覆盖原有内容。若先读后写则在文件末尾追加。
- w:只写,覆盖文件内容,文件不存在则新建
- w+:可读写,如果文件存在,则覆盖整个文件内容。不存在则新建。
- a:只写,从文件末尾追加内容,文件不存在则新建
- a+:可读写,从文件开头读取内容,从文件末尾添加内容
Python开发【第六篇】:文件处理的更多相关文章
- [Python笔记]第六篇:文件处理
本篇主要内容:open文件处理函数的使用 open函数,该函数用于文件处理 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = open('文件路径', '模式') 打 ...
- Python开发【第二篇】:初识Python
Python开发[第二篇]:初识Python Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...
- Python开发【第一篇】:目录
本系列博文包含 Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习编程的童鞋提供一点帮助!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python ...
- Python开发【第一篇】:目录
本系列博文包含Python基础.前端开发.Web框架.缓存以及队列等,希望可以给正在学习Python编程的朋友们提供一点帮助! .Python开发[第一篇]:目录 .Python开发[第二篇]:初始P ...
- Python开发【第一篇】Python基础之自定义模块和内置模块
为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...
- Python开发【第一篇】基础题目二
1 列表题 l1 = [11, 22, 33] l2 = [22, 33, 44] # a. 获取l1 中有,l2中没有的元素 for i in l1: if i not in l2: # b. 获取 ...
- python开发_xml.etree.ElementTree_XML文件操作_该模块在操作XML数据是存在安全隐患_慎用
xml.etree.ElementTree模块实现了一个简单而有效的用户解析和创建XML数据的API. 在python3.3版本中,该模块进行了一些修改: xml.etree.cElementTree ...
- python第六篇文件处理类型
阅读目录 一 文件操作 二 打开文件的模式 三 操作文件的方法 四 文件内光标移动 五 文件的修改 文件处理 ...
- Python开发【第一篇】:初识Python
初识python 一.python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
- 跟着老男孩教育学Python开发【第一篇】:初识Python
Python简介 Python前世今生 Python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解 ...
随机推荐
- mysql 启动服务错误
在博客上看到下面这个文档解决了问题.推荐可以看下. http://blog.csdn.net/yaowuliu/article/details/51133279
- Hibernate技术
Hibernate中3个重要的类: 配置类(configuration) 负责管理Hibernate的配置信息,包含数据库连接URL.数据库用户.数据库密麻麻.数据库驱动等. 会话工厂类(Sessio ...
- java中的向上转型
Person 可以表示为一个抽象的东西 就是人.比如说人可以唱歌, 就好比Person类中有一个sing方法.那么这个抽象的类(Person 人)可以具体到两类或者更多类 比如 男人,女人 .Man ...
- HIVE- 数据倾斜
数据倾斜就是由于数据分布不均匀,数据大量集中到一点上,造成数据热点.大多数情况下,分为一下三种情况: 1.map端执行比较快,reduce执行很慢,因为partition造成的数据倾斜. 2.某些re ...
- C++的异常捕获
听课笔记: #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; void fun() { ;// ...
- python第四篇:linux命令行总结 + 自动备份Python程序
由于最近需要学习Python爬虫相关的知识,所以就先从Python基础.Linux基础开始进行了学习,下面主要是总结了常见的Linux的命令行.最后为了巩固学到的东西,尝试写了个自动备份的Python ...
- GridView内容详解(转载)
GridView内容详解(转载) GridView是ASP.NET界面开发中的一个重要的控件,对GridView使用的熟练程度直接影响软件开发的进度及功能的实现.(车延禄)GridView的主要新特性 ...
- Ueditor基础使用
感谢大家对我这个菜鸟的帮助,这是我第一次用.NET做网站.在这里向大家推荐个百度免费的文本编辑器Ueditor,是.NET版的,在http://ueditor.baidu.com/website/in ...
- hihocoder-1285 智力竞赛(区间dp)
智力竞赛 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi.小Ho还有被小Hi强拉来的小Z,准备组队参加一个智力竞赛.竞赛采用过关制,共计N个关卡.在第i个关卡中,小 ...
- 批量处理JDBC语句提高处理速度
当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 JDBC的批量处理语句包括下面两个方法: – ...