python 读取或写入文件
文件是数据存储的单位,文件中的数据以字节为单位进行顺序存储,汉字在GBK中占2个字节,在UTF-8中占3个字节
文件的操作流程
- 打开文件
- 读/写文件
- 关闭文件
注意:任何操作系统,一个应用程序同时打开文件的数量有最大数限制的,所以要记得关闭文件
open方法
Python open() 方法用于打开一个文件,并返回文件对象。
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。
读取文件
f = open(file='mynote.txt', mode='r*', encoding=None)
参数:
- file:文件名或(相对/绝对)文件路径
- mode:文件打开模式
- encoding:python默认是ASCII编码,显示中文时会做一个ASCII到系统默认编码的转换,到时候会出错,所以一定要规定编码格式
返回:文件流对象
注意:如果打开文件失败,则会触发OSError错误
mode参数有
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(Python 3 不支持)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
默认为文本模式,如果要以二进制模式打开,加上 b 。
文本文件操作:
把文件的字节码自动转换为字符串,换行符会自动转换成'\n',默认文件中存储的都为字节数据,以行为单位进行分隔,在python内部统一用'\n'作为换行进行分隔
对文本文件读写需要用字符串(str)进行数据读取和写入
f.read() :从文件读取指定的字节流数,如果未给定或者为负则读取所有
f.readline() :从光标开始位置返回一行内容 返回是字符串格式
f.readlines() :以列表形式返回所有行内容,换行符也会读到
关闭文件
f.close() 关闭,释放系统资源
获取读的时候用with
with open(xxx) as f:
...
写入文件
f = open("haha.txt","w") f.write("hello")
如果写入的文件有内容,会清空内容再写入,如果没有.txt文件,会先创建再写入
F.writelines(lines) 将列表中的内容写入文件,内容要是字符串
f = open('mynote.txt', 'w') L = ['我是第一行\n', '我是第二行'] f.writelines(L) f.close()
二进制文件操作
二进制文件操作模式字符:'b'
默认文件中存储的是以字节为单位的数据,二进制文件操作需要用字节串进行读写
f.read() / f.readline() / f.readlines() 返回类型
- 对于 文本文件,f.read()等函数返回为 字符串(str)
- 对于 二进制文件,f.read()等函数返回为 字节串(bytes)
以二进制方式读取文件内容,然后再将其转换为字符串
try: f = open('infos.txt', 'rb') # 读取数据,常用f.read读取 b = f.read(5) # <<== 5 代表5个字节(bytes) print(b) # b'hello' b += f.read(2) print(b) # b'hello\xe4\xb8' b += f.read() # 不加实参读取全部字节,直至文件尾 print(b) # b'hello\xe4\xb8\xad\xe6\x96\x87' print('读取的内容转为文字后为:', b.decode('utf-8')) f.close() # 读取的内容转为文字后为: hello中文 except OSError: print("打开文件失败!") f = open('infos.txt', 'rb')
F.write()对于二进制文件需要用字节串进行操作
try: f = open("data.bin", 'wb') # 在此处需要以字节串为单位进行写操作 f.write(b'\xe4') # '中'字的编码: e4 b8 ad f.write(b'\xb8') f.write(b'\xad') f.write(b'\n\x41\x42\x43') f.close() except OSError: print("文件打开失败!") f = open("data.bin", 'wb')
用f.tell()方法获取文件当前的读写位置(字节单位)
f = open('data.txt', 'rb') print("当前的读写位置是:", f.tell()) # 0 b = f.read(5) print("当前的读写位置是:", f.tell()) # 5
用 f.seek(offset[,whence]) 方法来移动文件的读写指针位置(字节单位)
-
offset:开始的偏移量
-
大于0的数表示向文件尾开始移动偏移的字节数
- 小于0的数表示向文件头开始移动偏移的字节数
-
-
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;
0代表从文件开头开始算起
1代表从当前位置开始算起
2代表从文件末尾算起
f.seek(0) # 将指针指向文件头
清空缓冲区 f.flush()
import time f = open('infos.txt', 'w') f.write('hello') f.flush() # 强制清空缓冲区
编码注释:
在python源文件的第一行或第二行写入如下内容:
# -*- coding:gbk -*-
# 设置源文件编码格式为gbk
或
# -*- coding:utf-8 -*-
# 设置源文件编码格式为utf-8
作用:
告诉解释执行器,此前文件的编码是什么?
CSV文件读写
CSV是英文Comma Separate Values(逗号分隔值)的缩写,顾名思义,文档的内容是由 “,” 分隔的一列列的数据构成的。CSV文档是一种编辑方便,可视化效果极佳的数据存储方式。而Python中有着非常强大的库可以处理这种文档,所以,如果你经常用Python处理数据的话,CSV文档当然是一种简单快捷的轻量级选择。下面我将以一个数据处理的例子入手,展现CSV文档的创建和编辑,以及Python是如何对CSV文档读写的。
读CSV文件
方法1:CSV库 读
import csv with open("./data.csv", "r") as csvfile: csv_reader = csv.reader(csvfile) # 返回一个生成器 for line in csv_reader: print(line) # ['name', 'age'] # ['orlen', '28'] # ['never', '27']
方法2:pandas库 读
import pandas data = pandas.read_csv('./data.csv',sep=",") print(data) # dataframe数据格式 # name age # 0 orlen 28 # 1 never 27 for name, age in zip(data["name"], data["age"]): print(name, age) # orlen 28 # never 27
写CSV文件
方法1:CSV库 写
import csv headers = ['name', 'age'] row_1 = ["orlen", '28'] row_2 = ["never", '27'] with open("data.csv", "w",newline="") as csvfile: writer = csv.writer(csvfile) writer.writerow(headers) # 写一行 writer.writerows([row_1, row_2]) # 写多行
name,age orlen,14 never,15
方法2:pandas库 写
import pandas headers = ['name', 'age'] row_1 = ["orlen", '28'] row_2 = ["never", '27'] dataframe = pandas.DataFrame([row_1, row_2], columns=headers) dataframe.to_csv("./data.csv", index=False, sep=',')
name,age orlen,14 never,15
还可以以字典的形式写入
import pandas # name, site name = ["Google", "Runoob", "Taobao", "Wiki"] site = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"] dict = {'name': name, 'site': site} # 字典 df = pandas.DataFrame(dict) df.to_csv('./site.csv') # 保存 dataframe
,name,site 0,Google,www.google.com 1,Runoob,www.runoob.com 2,Taobao,www.taobao.com 3,Wiki,www.wikipedia.org
yaml文件读写
YAML,Yet Another Markup Language的简写,通常用来编写项目配置,也可用于数据存储,相比conf等配置文件要更简洁。
支持的数据类型:字典、列表、字符串、布尔值、整数、浮点数、Null、时间等
基本语法规则:
- 大小写敏感
- 使用缩进表示层级关系
- 相同层级的元素左侧对齐
- 键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
- 数组前加有 “-” 符号,符号与值之间需用空格分隔
- None值可用null 和 ~ 表示
- 多组数据之间使用3横杠---分割
- # 表示注释,但不能在一段代码的行末尾加 #注释,否则会报错
写
import yaml Data = { "page": 1, "msg": "地址", "data": [ {"id": 1, "name": "学校"}, {"id": 2, "name": "公寓"}, {"id": 3, "name": "流动人口社区"}] } with open('./data.yaml', 'w', encoding='utf-8') as f: yaml.dump(data=Data, stream=f, allow_unicode=True)
data: - id: 1 name: 学校 - id: 2 name: 公寓 - id: 3 name: 流动人口社区 msg: 地址 page: 1
读
import yaml with open('./data.yaml', 'r', encoding='utf-8') as f: result = yaml.load(f.read(), Loader=yaml.FullLoader) print(result["data"]) # [{'id': 1, 'name': '学校'}, {'id': 2, 'name': '公寓'}, {'id': 3, 'name': '流动人口社区'}] print(result["msg"]) # 地址
JSON文件读写
JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。
JSON 比 XML 更小、更快,更易解析,更多 JSON 内容可以参考 JSON 教程。
Pandas 可以很方便的处理 JSON 数据,本文以 sites.json 为例,内容如下:
参考
Python基础笔记1-Python读写yaml文件(使用PyYAML库)