1.数据的存储
- 1)数据存储的特点
计算机的内存分为硬盘和运行内存:
硬盘是用来存储文件的,除非手动删除或者硬盘出问题,否则存储在硬盘中的文件一直存在不会销毁;
运行内存是用来存储,程序在运行过程中产生的数据; 当程序运行结束后会自动销毁
如果希望程序中产生的数据在程序运行结束后不销毁,就需要将数据存到硬盘中(需要存在文件中)。
- 2)常用的文件
txt文件、json文件、plist文件、数据库文件等 -- 文本数据(字符串数据类型)
图片文件(png,jpg等)、音频文件(mp3, wav)、视频文件... -- 二进制文件
2.文件操作 - 操作文件内容
文件操作基本步骤:
打开文件(open) -> 操作文件(读read、写w/a) -> 关闭文件(close)
2.1 打开文件
open(file,mode='r',...,encoding=None)
open(文件路径, 打开方式, 文本编码方式) - 以指定的方式打开指定文件并且返回文件对象
说明:
file - 文件路径; 可以传文件的绝对路径和相对路径
- 1) 绝对路径: 文件在计算机中的全路径
- 2) 相对路径:
./ - 表示当前目录(当前写代码的那个文件所在的目录) - 可以省略
../ - 表示当前目录的上层目录
.../ - 表示当前目录的上层目录的上层目录-
mode - 文件打开方式, 决定打开文件后的操作权限(能读还是能写 - r/w); 操作的文件的时候数据的类型(文本/二进制 - t/b)
r - 只读;w - 只写; a - 只写; t - 文本数据(默认,可以不写), b - 二进制数据
r(rt/tr) - 打开文件后只能进行读操作,读出来的数据是字符串
rb/br - 打开文件后只能进行读操作, 读出来的数据是二进制数据(bytes)
w(wt/tw) - 打开文件后只能进行写操作, 写入的数据是字符串;打开的时候先清空原文件
wb/bw - 打开文件后只能进行写操作, 写入的数据是二进制数据;打开的时候先清空原文件
a(at/ta) - 打开文件后只能进行写操作, 写入的数据是字符串;打开的时候不会清空原文件
ab/ba - 打开文件后只能进行写操作, 写入的数据是二进制数据;打开的时候不会清空原文件注意: a、w在打开文件的时候,如果文件不存在,会自动创建文件 r在打开文件的时候,如果文件不存在,会报错
encoding - 文本文件编码方式; 只能以t的方式打开文本文件的时候可以赋值
一般采用'utf-8'的编码方式进行编码;保证同一个文件读和写的编码方式要一致
1.=========================文件路径===========================
- 1)绝对路径
open(r'/Users/yuting/Workspace/JAVA/授课/python1906/02-语言基础/day13-文件操作和异常捕获/files/test.txt')
- 2)相对路径
# open('./files/test.txt')
# open('files/test.txt')
2.=========================打开方式===========================
# open('files/test.txt', 'a')
# open('files/luffy.jpg', 'wb')
# open('files/a.txt') # FileNotFoundError: [Errno 2] No such file or directory: 'files/a.txt'
# open('files/a.txt', 'w')
# open('files/b.txt', 'a')
# open('files2/b.txt', 'a') # FileNotFoundError: [Errno 2] No such file or directory: 'files2/b.txt'
2.2操作文件
1)读操作
文件对象.read() - 读指定文件,并且返回文件中的内容(所有的文件都支持)
文件对象.readline() - 读指定文件一行的内容(只支持文本文件)2)写操作
f = open('files/test.txt', 'r', encoding='utf-8')
content = f.read()
print(content)
# 将读写位置移动到文件开头: 文件对象.seek(N) - 将读写位置移动到第N个字节的位置
f.seek(0)
line = f.readline()
print('line:', line)
# 关闭
f.close()
# print(f.read()) # ValueError: I/O operation on closed file.
# f = open('files/test.txt', 'w')
# content = f.read() # io.UnsupportedOperation: not readable
# print(content)
print('====================')
f = open('files/test.txt', 'r')
line = f.readline()
print(line)
print('读所有:')
content = f.read()
print(content)
f.close()
print('============练习============')
# 练习: 读指定文本文件中的内容,一行一行的读,读完为止
f = open('files/test.txt', 'r', encoding='utf-8')
while True:
line = f.readline()
if not line:
break
print(line)
f.close()
# 文本文件打开方式带b,读出来的数据是二进制数据
f = open('files/test.txt', 'rb')
content = f.read()
print(type(content)) #
f.close()
# 注意: 二进制文件(图片、音频、视频、exe文件等)打开的时候必须带b
f = open('files/luffy.jpg', 'rb')
content = f.read()
print(content)
f.close()
2.3 写操作
文件对象.write(内容) - 将指定的内容写入到指定文件中
f = open('files/test.txt', 'a', encoding='utf-8')
f.write('abc')
f.close()
# 如果写的时候带b,写入数据的类型必须是二进制
f = open('files/test.txt', 'ab')
f.write('hello'.encode())
f.close()
num = 100
f = open('files/num.txt', 'w', encoding='utf-8')
f.write(str(num))
f.close()
1.数据持久化
- 1)需要持久化的数据要保存在文件
- 2)需要数据的时候不是在程序中直接给初始值,而是从本地文件中读数据
- 3)如果这个数据的值发生改变,要将最新的数据更新到文件中
# 练习: 在程序中用一个变量来记录当前程序启动的次数
# 需要数据的的时候读数据
f = open('files/num.txt', 'r', encoding='utf-8')
count = int(f.read())
print(count)
f.close()
# 数据发生改变后更新文件
count += 1
f = open('files/num.txt', 'w', encoding='utf-8')
f.write(str(count))
f.close()
2.文件域
打开指定文件,在文件作用域结束后会自动关闭文件
with open(文件路径,打开方式,编码方式) as 文件对象:
文件作用域
with open('files/test.txt', 'r', encoding='utf-8') as f1:
re = f1.read()
print(re)
# print(f1.read()) # ValueError: I/O operation on closed file.
# 每次运行程序添加一个学生,要求之前添加的学生要一直存在
"""
张三
[张三]
李四
[张三, 李四]
小明
[张三, 李四, 小明]
"""
# with open('files/students.txt', 'r', encoding='utf-8') as f1:
# students = f1.read()
#
# name = input('学生姓名:')
# if students == '[]':
# # [张三]
# students = '{}{}]'.format(students[:-1], name)
# else:
# # [张三,李四]
# students = '{},{}]'.format(students[:-1], name)
#
# print(students)
#
# with open('files/students.txt', 'w', encoding='utf-8') as f:
# f.write(students)
3.容器字符串的转换: eval
eval(字符串) - 将字符串转换成容器型数据类型的数据(要求字符串去掉引号后本身是合法的容器数据)
# 怎么将字符串: '[张三,李四,小明,tom]' 转换成列表: [张三,李四,小明,tom]
str1 = '[1, 2, 3]'
# 将列表字符从转换成列表
re1 = eval(str1)
print(re1, type(re1))
re1.append(100)
print(re1) # [1, 2, 3, 100]
str2 = "{'a': 10, 'b': 20}"
# 将字典字符串转换成字典
re2 = eval(str2)
print(re2, type(re2))
print(re2['a'])
str3 = "[{'name': '小明', 'age': 18}, {'name': '小花', 'age': 19}, {'name': 'Lisa', 'age': 22}]"
re3 = eval(str3)
print(type(re3))
print(type(re3[0]))
json模块是python提供的专门用来支持json数据
import json
1.什么是json
json是一种数据格式: 一个json只有一个数据;唯一的这个数据必须是json支持的数据类型的数据
json支持的数据类型:
- a.数字类型(number) - 包含所有的数字(整数和小数), 并且支持科学计数法;数字直接写
100 12.5 -3.14 3e4 - b.字符串(string) - 文本数据,只能使用双引号引起来,并且支持转义字符
"abc", "abc123", "hello", "abc\n123", "\u4e00abc" - c.布尔(boolean) - 只有true和false两个值
- d.空值 - null(表示空)
- e.数组(array) - [元素1,元素2,元素3,....] 这儿的元素可以json支持的任何类型的数据
- f.字典(dictionary) - {key1:value1, key2:value2, ...} key必须是字符串
2.json转python
1)转换规律
json python
数字 int/float
字符串 字符串;(双引号一般会变成单引号)
布尔 布尔;true -> True; false -> False
null None
数组 列表
字典 字典2)方法
json.loads(字符串) - 将json格式的字符串转换成python对应的数据
注意: 要求这个字符串的内容必须是json格式的数据
result = json.loads('100')
print(result, type(result))
# result = json.loads('abc') # json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
result = json.loads('"abc"')
print(result, type(result))
result = json.loads('[12, "abc", true, null]')
print(result, type(result)) # [12, 'abc', True, None]
b = '{"name": "小明", "age": 100}'
result = json.loads(b)
print(result, result['name'])
3.python转json
1)转换规律
python json
int/float 数字
字符串 字符串; 单引号会变成双引号
布尔值 布尔; True -> true; False -> false
None null
列表/元祖 数组
字典 字典2)方法
json.dumps(数据) - 将python数据转换json格式的字符串(返回值是python的字符串,这个字符串的内容是json数据)
result = json.dumps(100)
print([result]) # '100'
result = json.dumps('abc')
print([result]) # '"abc"'
result = json.dumps([True, None, 'hello'])
print([result]) # '[true, null, "hello"]'
result = json.dumps((10, 'abc', False))
print([result]) # '[10, "abc", false]'
a = {10: 100, 'name': 'Tom'}
result = json.dumps(a)
print([result]) # '{"10": 100, "name": "Tom"}'