day13-文件操作和json数据

1.文件操作

1)数据存储和数据本地化(数据持久化)

程序中产生的数据默认都是保存在运行内存中的,这些数据在程序运行结束后自动销毁
如果希望数据在程序结束后不销毁,就必须将数据存储在硬盘中(通过文件来存)

txt文件、json文件、plist文件、各种数据库文件
图片文件(png、jpg、jpeg)、视频文件、音频文件

2)怎么把数据保存在硬盘中

基本步骤:打开文件(创建文件) -> 操作文件(读操作/写操作) -> 关闭文件

3)打开文件

1)方法
open(file, mode='r', encoding=None,...) - 以指定的方式打开指定文件并且返回文件对象

a.file - 字符串,本地文件路径,可以是绝对路径也可以是相对路径

绝对路径:文件在计算机上的全路径
相对路径:相对当前目录(代码文件所在的目录)
./ - 代表当前目录
../ - 代表当前目录的上层目录
.../ - 代表当前目录的上层目录的上层目录

b.mode - 字符串,读写方式;决定打开文件后能做什么,以及读写的数据是类型

'r' - 只读; 'w' - 只写(清空原文件); 'a' - 只写; 'b' - 二进制; 't' - 文本(字符串)
注意:'b'和't'中必须有一个,如果不写就是't'
'r'/'rt'/'tr' - 只读,读到的数据的类型是字符串
'rb'/'br' - 只读,读到的数据的类型是二进制
'w'('wt'/'tw') - 只写,写入文件中的数据的类型是字符串;打开后会清空原文件的内容
'wb'/'bw' - 只写,写入文件中的数据的类型是二进制;打开后会清空原文件的内容
'a'('at'/'ta') - 只写,写入文件中的数据的类型是字符串
'ab'/'ba' - 只写,写入文件中的数据的类型是二进制

c.encoding - 字符串,文本文件的编码方式;一般使用'utf-8'

注意:1.二进制数据不能设置encoding(mode带b都不能设置)

2)同一个文件读写时的编码方式必须一致

4)操作文件

1.读操作 - 获取文件中的内容

a.文件对象.read() - 获取指定文件对象中内容(从文件读写位置开始到文件结束),并且返回
b.文件对象.readline() - 读一行内容(从文件读写位置到一行结束),并且返回

print('========读操作========')
f = open('./files/text1', 'r', encoding='utf-8')
content = f.read()
print(content, type(content))

f.seek(0)   # 将文件读写位置设置到文件开头
content2 = f.readline()
print('content:', content2)

print(f.read())
# 练习:将文本文件中的内容一行一行的读,读完为止
f = open('./files/text1', 'r', encoding='utf-8')
while True:
    content = f.readline()
    if not content:
        break
    print(content)

2.写操作 - 修改文件中的内容

文件对象.write(数据) - 将指定数据写入指定文件;数据只能是结果是字符串的数据或者是二进制数据

print('============写操作============')
f = open('./files/text1', 'w', encoding='utf-8')
f.write('hello')

5)关闭文件

文件对象.close() - 关闭指定文件;文件关闭后不能进行读写操作

f.close()

6)文件作用域

with open(file, mode='r', encoding=None,...) as 文件对象:
文件作用域

文件作用域 - 只有在文件作用域范围内才能操作文件;离开文件作用域,文件会被自动关闭

with open('./files/text1', encoding='utf-8') as f1:
    print('文件作用域:', f1.readline())

# f1.seek(0)       # ValueError: I/O operation on closed file.

2.数据本地化

1)怎么将数据持久化

1.将需要持久化的数据保存到本地文件中
2.需要使用数据的时候从文件中去读这个数据
3.数据发生改变以后,要将最新的数据更新到文件中

# 练习:写程序,在程序中打印当前程序运行的次数
with open('./files/num', 'r', encoding='utf-8') as f:
    num = int(f.read())
print(num)
num += 1
with open('./files/num', 'w', encoding='utf-8') as f:
    f.write(str(num))

2)打开不存在的文件

如果以读的形式打开一个不存在的文件,程序会报错
如果以写的形式打开一个不存在的文件,程序不会报错,而且会自动创建这个文件再打开。

注意:如果路径中的文件夹不存在,以写的形式打开还是会报错

补充:eval函数
eval(字符串) - 将字符串转换成列表或者字典;字符串必须是去掉引号后本身就是一个列表或者字典

# 练习:运行程序输入学生的姓名和成绩;输入完成后打印所有学生的信息,要求之前输入的学生信息,后面还能打印
name = input('请输入学生姓名:')
score = float(input('请输入学生成绩:'))
stu = {'name': name, 'score': score}
# 需要数据从文件读出来
with open('./files/student', 'r', encoding='utf-8') as f2:
    all_students = eval(f2.read())

# 修改保存的数据
all_students.append(stu)

# # 更新文件
with open('./files/student', 'w', encoding='utf-8') as f2:
    f2.write(str(all_students))

for stu in all_students:
    print(stu)

3.json数据

1)json数据

json是一种数据格式;
json的数据格式:一个json有且只能有一个数据;这一个数据必须是json支持的数据类型的数据

json支持的数据类型:
数字类型  - 包含所有的数字,小数中支持科学计数法,例如:89, 12.89
字符串   - 使用双引号引起来的数据。‘hello’,'123'
布尔   - 只有true和false两个值
空值   - null
数组   - 相当于python中的列表,[元素1,元素2,...]
字典   - 相当于python中的字典,{key1:value1, key2:value2,...} key只能是字符串

2)json和python相互转换 - json模块

a.json数据转换成python数据(爬虫、数据可视化、数据分析) - json.loads()
json python
数字 int/float
字符串 str;可能会将双引号变成单引号
布尔 bool;true -> True,false -> False
空值 null -> None
数组 list
字典 dict

json.loads(数据) - 将json数据转换成python数据。
数据必须是字符串;字符串中的内容必须是json格式的数据

result = json.loads('true')
print(result, type(result))

result = json.loads('{"name": "ysy", "age": 18}')
print(result, type(result))

b.将python数据转换成json(web后端开发 - 写服务器程序、写接口)
python json
int/float 数字
bool 布尔;True -> true,False -> false
str 字符串;单引号都会变成双引号
None None -> null
list,tuple 数组
dict 字典
json.dumps(数据) - 将python数据转换成json格式的字符串

result = json.dumps(100)
print(result, type(result))

result = json.dumps('100')
print(result, type(result))

result = json.dumps([10, 'abc', None])
print(result, type(result))
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,739评论 0 10
  • day12-文件操作和json数据 一、文件操作 1. 数据持久化 计算机内存分为硬盘和运行内存 存储到本地文件中...
    Octane阅读 294评论 0 1
  • 1.文件操作 1).数据持久化(数据本地化) 保存在程序中的数据是保存在运行内存中的,当程序运行结束,内存会自动释...
    tcis阅读 270评论 0 0
  • 一.文件管理 os库提供了很多和文件管理操作 1.数据本地化和数据持久化 - 通过文件将数据存到硬盘中数据库文...
    程序里的小仙女阅读 428评论 0 3
  • 到kelantan11天了。 应该写点文字记录这过去的11天。 9月11日那天中午孔院的马来老师AME把我送到KB...
    淡心深思阅读 723评论 6 7