一 文件基本操作
1.1.文件操作 - 文件内容的操作,主要是文件读操作和写操作
1.2.文件基本操作步骤
第一步:打开文件
第二部:读文件-获取文件内容/写文件-将内容写入文件中
第三步:关闭文件
1.2.1打开文件
open(file,mode,…,encoding=None) - 以指定的方式打开指定文件并且得到一个文件对象
- file - 字符串,需要打开的文件路径
- mode - 文件打开方式(决定打开文件后能够支持的操作是读还是写,默认是’r’(读操作);
控制读写的mode值
‘r’(默认) - 只读,被打开的文件不存在会报错
‘w’ - 只写,打开的时候会先删除原文件的内容,被打开的文件不存在,会自动创建
‘a’ - 只写,打开的时候不会删除原文件的内容,被打开的文件不存在,会自动创建
‘x’ - 只写,新建文件(打开已存在的文件会报错,打开不存在的文件会自动创建)
控制数据类型的mode值
‘t’(默认) - 文件的数据是文本数据(字符串类型,默认值,只有文本文件操作的时候才能使用)
‘b’ - 文件的数据是二进制数据(bytes类型,适用于所有文件,不能设置encoding的值)
注意:mode值的两种控制方式要一起用,‘rt’/‘tr’/‘rb’/‘br’,‘wt’/tw’/‘wb’/‘bw’,…
- encoding - 文本文件的编码方式,一般设置为’utf-8’
f = open('files/poem.txt')
# ========控制数据类型=======
f = open('files/poem.txt', 'rt')
content = f.read()
print(type(content))
1.2.2 读写文件
文件对象.read()
文件对象.write(内容)
1. 2.2.1 读文件
- 文件对象.read() - 从文件读写位置开始,读写文件结束(以读的形式打开文件,文件读写位置在文件开头)
f = open('files/词.txt')
content = f.read()
print(content)
print('=============')
# 文件对象.seek(偏移量) - 将读写位置移动到离文件开头指定距离所在的位置(一般设置为0,让读写位置回到文件开头)
f.seek(0)
content = f.read()
print(content)
- 文件对象.readline() - 读一行(从读写位置开始到一行结束)
print('=======================')
f = open('files/词.txt')
line = f.readline()
print(line)
练习:一行一行的读,将整个文件的内容读完
f = open(‘files/词1.txt’, encoding=‘UTF-8’)
line = ‘’
while True:
line = f.readline()
if line == ‘’:
break
print(line)
1.2.3.写文件
文件对象.write(内容)
f = open('files/poem.txt', 'w',encoding='UTF-8')
f.write('123abc')
f = open('files/poem.txt', 'a',encoding='UTF-8')
f.write('你好')
1.2.4.关闭文件
文件对象.close() - 关闭指定文件
f.close()
f.write('asd') # I/O operation on closed file.
二 文件域
文件域 - 文件对象的作用范围
通过with open 打开文件,能够让被打开的文件对象自带作用范围,不需要手动关闭文件。
with open(file,mode='r',...,encoding=None) as 文件对象:
文件的作用域
with open('files/词1.txt', encoding='UTF-8') as f:
print(f.read())
print(f.read()) # ValueError: I/O operation on closed file.
三 数据持久化
3.1.数据持久化
程序中的数据默认都是保存在运行内存中的,当程序运行结束后全部都会自动销毁
数据持久化是将数据保存到文件中(文件是保存在硬盘中,硬盘中的数据除非硬盘损坏或者格式化或者手动操作,否则是不会销毁的)
3.2.什么时候需要做数据持久化
如果希望这次运行程序产生的数据,在下一次运行程序的时候还能用,那么这个时候就需要做持久化
3.3.怎么做持久化
满足以下三点数据就能持久化:
a.用一个文件来保存对应的数据
b.程序中需要这个数据的时候,从文件中读出这个数据,而不是在程序中直接给值
c.数据发生了改变,要将最新的数据更新到文件中
练习:写程序打印当前程序运行的次数
with open('files/num.txt', encoding='UTF-8') as f:
num = int(f.read())
num += 1
with open('files/num.txt', 'w', encoding='UTF-8') as f:
f.write(str(num))
print('次数:', num)
四 CSV文件的写操作
4.1.什么是CSV文件
CSV是一种用逗号将一行数据隔开的文本文件,这种文件可以用表格来打开,多用于数据处理中数据的提供和保存。
4.2.Python中怎么操作CSV文件
Python的标准库中有一个csv库,专门用来提供和csv文件操作相关功能
4.2.1写数据
a.创建writer
写对象 = csv.writer(csv文件对象)
写对象.writerow(元素是一行内容的列表) - 写入一行数据
写对象.writerows(元素是列表的列表) - 写入多行数据
import csv
- csv文件的写操作方式一 - 以列表的形式写入数据
with open('files/学生信息.csv', 'w', encoding='UTF-8', newline='') as f:
# a.写入数据
# 创建writer
writer = csv.writer(f)
# 写入一行数据
writer.writerow(['姓名', '成绩', '年龄'])
# 同时写入多行数据
writer.writerows([
['张三', '90', '28'],
['李三', '95', '18'],
['刘三', '83', '25'],
])
- csv文件的写操作方式二 - 以字典的形式写入数据
with open('files/商品信息.csv', 'w', newline='', encoding='UTF-8') as f:
# 创建writer对象
# csv.DictWriter(文件对象,字段名列表)
writer = csv.DictWriter(f, ['商品名称', '价格', '折扣', '数量'])
# 单独添加头部数据(将字段名列表中的元素作为第一行的数据写入文件)
writer.writeheader()
# 添加一条其他数据
writer.writerow(
{'商品名称': '鞋子', '价格': '¥300', '折扣': 7, '数量':230}
)
# 同时添加多条其他数据
writer.writerows([
{'商品名称': '鞋子', '价格': '¥300', '折扣': 7, '数量':500},
{'商品名称': '帽子', '价格': '¥500', '折扣': 7},
{'商品名称': '围巾', '价格': '¥200', '折扣': 7},
{'商品名称': '裤子', '价格': '¥100', '折扣': 7}
])
五 CSV文件的读操作
5.1.以列表的形式读数据
with open('files/商品信息.csv', newline='', encoding='UTF-8') as f:
# 获取文件的内容,返回值reader本质是一个迭代器,迭代器中的元素是每一行内容对应的列表。
reader = csv.reader(f)
# a.一行一行的获取数据
# 单独取出第一行数据
next(reader)
# 遍历其他行的数据
for x in reader:
print('x', x)
# b.同时获取所有数据
data = list(reader)
print(data)
5.2.以字典的形式读数据
with open('files/商品信息.csv', newline='', encoding='UTF-8') as f:
reader = csv.DictReader(f)
# 直接获取第一行数据对应的列表
print(reader.fieldnames)
# 遍历获取每一行数据对应的字典(需要将元素转换成字典)
for x in reader:
print('x', dict(x))
with open('files/商品信息.csv', newline='', encoding='UTF-8') as f:
reader = csv.DictReader(f)
new_reader = list(map(lambda item: dict(item), reader))
print(new_reader)
all_name = list(map(lambda item: item['商品名称'], new_reader))
print(all_name)
六 json数据
6.1.什么是json
json是一种特殊的文本数据格式,绝大部分编程语言都支持这种格式的数据的处理,一般在不同语言的程序之间进行数据交流的时候,数据的格式都是json格式。
6.2.json格式
json格式的数据要求:
1)一个json有且只有一个数据
2)唯一的这个数据必须是json支持的数据类型的数据
json支持的数据类型和表示方式:
数字类型 - 所有的数字;表示的时候直接写:100,-100,23.98
字符串 - 所有的文本数据;表示的时候需要双引号引起来:“啊哈”,“hello”,“abc\n123”,“4e00”
布尔类型 - 只有 true 和 false 两个值
数组类型 - [元素1,元素2,元素3,…]
字典类型 - {键1:值1,键2:值2,…}
空值 - null(相当于Python中的None)
6.3.python数据和json之间的相互转换
python标准库中提供了一个json模块,专门用来解决python中json数据的处理
- python 转 json
int/float 数字
字符串 双引号字符串
True true
False false
None null
列表、元组 数组
字典 字典
json.dumps(python数据) - 将指定的python数据转换成对应的json格式的字符串(字符串的内容符合json格式的要求的字符串就是json格式的字符串)
import json
num = 48
num_json = json.dumps(num)
print([num_json])
str1 = '你好,json'
str1_json = json.dumps(str1)
print([str1_json])
- json->python
json 转 python
数字 int/float
字符串 字符串(引号会变成单引号)
true True
false False
null None
数组 列表
字典 字典
json.loads(json格式的字符串) - 将json格式字符串中的数据转换成相应的python类型的数据
result = json.loads('"abc"')
print([result])
result = json.loads('234')
print([result])