Day12-python文件操作和异常捕获

文件操作

1.数据的存储

1)数据存储的特点

计算机的内存分为硬盘运行内存:
硬盘是用来存储文件的,除非手动删除或者硬盘出问题,否则存储在硬盘中的文件一直存在不会销毁;
运行内存是用来存储,程序在运行过程中产生的数据; 当程序运行结束后会自动销毁
如果希望程序中产生的数据在程序运行结束后不销毁,就需要将数据存到硬盘中(需要存在文件中)。

2)常用的文件
txt文件、json文件、plist文件、数据库文件等 -- 文本数据
图片文件(png,jpg等)、音频文件(mp3, wav)、视频文件... -- 二进制文件

2.文件操作 - 操作文件内容

文件操作基本步骤:
打开文件(open) -> 操作文件(读read、写) -> 关闭文件(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()

练习: 读指定文本文件中的内容,一行一行的读,读完为止

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))   # <class 'bytes'>
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

四、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]  <class 'list'>

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

推荐阅读更多精彩内容