Python_刻意练习 Task_07:文件与文件系统

Python:文件与文件系统

学习资料:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640
背景知识:IO操作即为Input/Output。程序运行过程中,有时需要将内存数据写到磁盘IO中,有时需要网络和其他应用程序或服务器进行数据转换,会用到网络IO。譬如:我们访问网页输入网址,浏览器发出一个网络IO使服务器收到请求进行解释,再把检索的网页从磁盘(IO)中读出,通过网络IO返回浏览器,显示在页面上。
在这里插入图片描述

IO中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。

另外IO有两种模式,一种是同步IO,一种是异步IO。打个比方就是好比你去餐厅点餐,你说“来个包子”,服务员告诉你,对不起,包子要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。你说“来个包子”,服务员告诉你,包子需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步IO。很明显使用异步IO效率上要比同步IO的效率要高。

异步IO我们又分为两种,还拿买包子来说,包子好了,服务员来通知你包子好了,这是回调模式,如果服务员发短信通知你,你需要不停地检查手机来知道包子是否做好啦,这就是轮训模式
(学习转载自https://blog.csdn.net/c123_sensing/article/details/81629799

最最基本知识补充:

  • 保存代码:ctrl+s到磁盘
  • windows常用类型:
    .exe——可执行文件
    .avi——视频
    .mp4——视频
    .jpg——图片
    .ppt——幻灯片
    .txt——文件

Part 01:文件

1.文件读写
A.读文件
常用形式:

open(file, mode='r')

mode参数以及file对象的常用函数总结:
https://www.runoob.com/python3/python3-file-methods.html

  • open()打开文件(文件要存在)
  • 调用read()一次性读取文件。
    如果文件内存过大,可以反复调用read(size),每次读取size个字符的内容。也可以调用readline()每次读取一行的内容,readlines()一次读取所有内容并按行返回list。
for each in lines:
    each.strip()
    print(each)
  • f.close()关闭文件,避免文件对象会占用操作系统的资源。
with open('/path/to/file', 'r') as f:
    print(f.read())#保证无论是否出错都能正确地关闭文件

二进制文件
要读取二进制文件,比如图片、视频等等,用’rb’模式打开文件即可:

 f = open('f', 'rb')
>>> f.read()

字符编码
读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

 f = open('ft', 'r', encoding='gbk')
 f.read()
 f = open('f', 'r', encoding='gbk', errors='ignore')
 #遇到有些编码不规范的文件,可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略。

B.写文件
调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件:

 f = open('f', 'w')
 f.write('Hello, world!')
 f.close()
  • 可以反复调用write()来写入文件,但是==务必要调用f.close()来关闭文件。==当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
    优化:
with open('f', 'w') as f:
    f.write('Hello, world!')
  • 以’w’模式写入文件时,如果文件已存在,原文件会清除。可以传入’a’以追加(append)模式写入。

2.StringIO和BytesIO
A.StringIO
即在内存中读写str。

  • 先创建一个StringIO,然后,像文件一样写入即可:
from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
>>> f.write(' ')
>>> f.write('world!')
>>> print(f.getvalue())
#hello world!
#getvalue()方法用于获得写入后的str。

要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:

 from io import StringIO
>>> f = StringIO('Hello!\nHi!\nGoodbye!')
>>> while True:
...     s = f.readline()
...     if s == '':
...         break
...     print(s.strip())
...
#Hello!
Hi!
Goodbye!

B.BytesIO
StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO。
BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes:

>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
#!:写入的不是str,而是经过UTF-8编码的bytes。

和StringIO类似,可以用一个bytes初始化BytesIO,然后,像读文件一样读取。

3.操作文件和目录
简介:操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。但是os模块的某些函数是跟操作系统相关的。
环境变量
在操作系统中定义的环境变量,全部保存在os.environ这个变量中,可以直接查看:

>>> os.environ
environ({'VERSIONER_PYTHON_PREFER_32_BIT': 'no', 'TERM_PROGRAM_VERSION': '326', 'LOGNAME': 'michael', 'USER': 'michael', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin', ...})

也可以直接调用os.environ.get(‘key’):

>>> os.environ.get('PATH')
'/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/mysql/bin'
>>> os.environ.get('x', 'default')
'default'

OS用法:

# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
#可以直接让你得到文件扩展名
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
# 对文件重命名:
>>> os.rename('test.txt', 'test.py')
# 删掉文件:
>>> os.remove('test.py')

4.序列化
简介:把变量从内存中变成可存储或传输的过程称之为序列化(pickling),序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。反之,把变量内容从序列化的对象重新读到内存里称之为反序列化(unpickling)。

A.序列化

  • pickle.dumps()将任意对象序列化成bytes,然后将其写入文件。
  • pickle.dump()直接把对象序列化写入file-like Object。
>>> import pickle
>>> d = dict(name='Bob', age=20, score=88)
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x03\x00\x00\x00ageq\x01K\x14X\x05\x00\x00\x00scoreq\x02KXX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00Bobq\x04u.'#这些都是Python保存的对象内部信息。
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

B.反序列化

  • pickle.loads()反序列出对象
  • pickle.load()从file-like Object中直接反序列化出对象
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'age': 20, 'score': 88, 'name': 'Bob'}#这个变量和原来的变量是完全不相干的对象,它们只是内容相同而已。

C.JSON
为了方便在不同编程语言中传递对象,就要把对象程序化为标准格式。可以用JSON解决。JSON表示出来是一个字符串,可以被所有语言读取。JSON表示的对象就是标准的JavaScript语言的对象

JSON和Python内置的数据类型对应如下:
在这里插入图片描述
Python内置的json模块可以完成Python对象到JSON格式的转换。这个序列化过程可以用dump,只需将pickle换成json,反序列化同。

>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"age": 20, "score": 88, "name": "Bob"}'

>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'}

如果遇到对象不是一个可序列化为JSON的对象。 用可选参数default就是把任意一个对象变成一个可序列为JSON的对象。

  • Student实例首先被student2dict()函数转换成dict
def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

-再被顺利序列化为JSON。

>>> print(json.dumps(s, default=student2dict))
{"age": 20, "name": "Bob", "score": 88}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值