Python多格式文件读写操作
1、文件操作
1.1 文件操作介绍
- 在实际操作中,通常需要将数据写入到本地文件或者从本地文件中读取数据等操作,那么作为Python爱好者的我们,必须掌握用Python语言去对本地文件进行操作
比如
本地文件操作步骤
- 找到文件所在位置
- 打开文件
- 操作文件
- 关闭文件
1.2 open()函数
1.2.1 open()函数语法
- Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出
注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)
open(file,mode=‘r’,encoding=None) --> 打开文件
完整语法:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
- file: 必需,文件路径(相对或者绝对路径)。
- mode: 可选,文件打开模式
- buffering: 设置缓冲
- encoding: 一般使用utf8
- errors: 报错级别
- newline: 区分换行符
- closefd: 传入的file参数类型
- opener:
- **file **–> 文件路径
- **mode **–> 操作文件模式
r --> 只读模式
w --> 写入
a --> 追加
- encoding --> 指定文件编码
utf-8–> 当文件中文乱码时,则指定编码为utf-8解决。
只读模式r
f.readable() --> 判断是否可读,返回值为布尔
f.read(n) --> 读取全部,在python3中n为字符
f.readline() --> 逐行读取,包括\n
f.readlines() --> 读取所有,返回值为列表,包括\n
f.tell() --> 文件指针所处文件位置
mode 参数有:
模式 | 描述 |
---|---|
t | 文本模式 (默认)。 |
x | 写模式,新建一个文件,如果该文件已存在则会报错。 |
b | 二进制模式。 |
+ | 打开一个文件进行更新(可读可写)。 |
U | 通用换行模式(Python 3 不支持)。 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
默认为文本模式,如果要以二进制模式打开,加上 b 。
练习
- 新建E:\just_do_it\rp_table_field.csv
- 通过f.readlines()读取文件全部内容
- 去掉\n换行符
- 使用到Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格)。
rstrip()方法语法:
str.rstrip([chars])
chars – 指定删除的字符(默认为空格)
返回删除 string 字符串末尾的指定字符后生成的新字符串。
f = open('E:\\just_do_it\\rp_table_field.csv', 'r')
res = f.readlines() # 读取csv的全部内容
lines = len(res) # 返回文件的全部行数
print(lines)
for i in range(lines):
res[i] = res[i].strip('\n') # 通过for循环查找每一行的'\n'字符,并通过strip函数进行替换
print(res)
f.close() # 关闭文件
注意
- r模式,当文件不存在时则报错
- f.read() --> 读取全部
- f.readline() -->逐行读取
- f.readlines() -->读取全部,且为列表
- 读取不可逆
1.2.2 只写模式w
概述:
write() 方法用于向文件中写入指定字符串。
- 在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。
- 如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。
语法
- write() 方法语法如下:
- fileObject.write( [ str ])
参数
str – 要写入文件的字符串。
返回值
返回的是写入的字符长度。
注意
- w模式,当文件不存在时创建文件
- 再次写入为覆盖
- **f.writable() ** --> 判断是否可写
- **f.write(str) ** --> 写入内容,返回值为写入字符串的长度
- **f.writelines(seq) ** --> 写入多行,但需要自己添加换行符
练习
创建test.txt文件,并且写入内容
f = open('E:\\just_do_it\\test.csv', 'w')# 如果test文件存在则进行写入,如果不存在则创建test.csv文件
i=0
for i in range(10):
res = f.write(str(i)+'\n') #增加换行符
print(res)
f.close()
1.2.2 覆盖或追加模式
注意
- a模式,当文件不存在时创建文件
- 再次写入为追加
Python操作二进制
f = open('E:\\just_do_it\\test.csv', 'wb')# 如果test文件存在则进行编辑,wb以二进制格式打开一个文件只用于写入。
# 如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
i=0
for i in range(10):
res = str(i)+'\n' #增加换行符
print(f.write(bytes(res,encoding='gbk')))
f.close()
b = b'hello world'
f = open('test5.txt','wb')
f.write(b)
f = open('E:\\just_do_it\\test.csv', 'ab+')# 如果test文件存在则进行编辑,ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
i=0
for i in range(20):
res = str(i)+'\n' #增加换行符
print(f.write(bytes(res,encoding='gbk')))
f.close()
1.2.3 Python操作json文件
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
json格式:’{“key”:“value”}'
使用 JSON 函数需要导入 json 库:import json。
函数 | 描述 |
---|---|
json.dumps | 将 Python 对象编码成 JSON 字符串 |
json.loads | 将已编码的 JSON 字符串解码为 Python 对象 |
json.dumps
json.dumps 用于将 Python 对象编码成 JSON 字符串。
语法
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
python 原始类型向 json 类型的转化对照表:
Python | JSON |
---|---|
dict | object |
list, tuple | array |
str, unicode | string |
int, long, float | number |
True | true |
False | false |
None | null |
练习
将{ ‘a’ : 1, ‘b’ : 2, ‘c’ : 3, ‘d’ : 4, ‘e’ : 5 }写入E:\just_do_it\test.json文件中
#!/usr/bin/python
import json
f = open('E:\\just_do_it\\test.json','a')
data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ] #设置一个key,value的列表
json = json.dumps(data)# 通过json.dumps把Python 对象编码成 JSON 字符串。
json = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': ')) # 格式化字符串
f.write(str(json)) # 通过a的方式追加json格式的字符串到test.json中
# f.write(str(json.dumps({ 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 }, sort_keys=True, indent=4, separators=(',', ': '))))
f.close()
json.dumps
json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
语法
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
json 类型转换到 python 的类型对照表:
JSON | Python |
---|---|
object | dict |
array | list |
string | unicode |
number (int) | int, long |
number (real) | float |
true | True |
false | False |
null | None |
练习
读取E:\just_do_it\test1.json文件中的数据
#!/usr/bin/python
import json
f = open('E:\\just_do_it\\test1.json','r')
# data = f.write('{"a":1,"b":2,"c":3}')
# j_data = json.dumps(data,sort_keys=True, indent=4, separators=(',', ': '))
l_data = json.load(f)
j_date = json.dumps(l_data,sort_keys=True, indent=4, separators=(',', ': '))
print(j_date)
f.close()
1.2.4 f.close()操作
要注意的是,当文件打开之后,必须通过f.close()语句来关闭文件,释放资源。
try:
f = open('test2.txt','r')
f.read()
finally:
if f:
f.close()
1.2.5 with open()
with open() --> 上下文管理器
with关键字用于Python的上下文管理器机制。为了防止诸如open这一类文件打开方法在操作过程出现异常或错误,或者最后忘了执行close方法,文件非正常关闭等可能导致文件泄露、破坏的问题 。Python提供了with这个上下文管理器机制,保证文件会被正常关闭。在它的管理下,不需要再写close语句。其余操作都同open()一致。
练习
with open('Students.txt','r') as f:
print(f.readlines())