廖雪峰Python3学习笔记-IO编程

本文是笔者学习廖雪峰Python3教程的笔记,在此感谢廖老师的教程让我们这些初学者能够一步一步的进行下去.如果读者想学习完成的教程,请访问廖雪峰Python3教程,笔记如有侵权,请告知删除...

读文件

以读文件的方式打开文件的做法是使用Python内置的open()函数,参数为文件名和标识符

标识符:

r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。

r+ 打开一个文件用于读写。文件指针将会放在文件的开头。

rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。

a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

f = open('User/joe/Desktop/test1.py', 'r')

如果文件不存在的话,就会抛出一个IOError错误,来告诉你找不到文件.

open()打开文件之后,就可以使用read()来一次读取全部的文件,最后需要调用close()来关闭文件.但是由于可能会出现IOError迫使程序运行终止,那么就永远不会走到close()方法了.

所以,Python中提供了with()语句来自动帮我们调用close()方法.

with open('User/joe/Desktop/test1.py', 'r') as f:
    f.read()

使用read()方法读取文件的时候,是一次性打开全部的内容,如果文件很大的话,内存就会出现问题.为了保险起见,需要在read()方法中传入一个size参数,然后反复调用read()反复,保证每次读取合适大小的内容,直到最后调用结束.除此之外,Python中提供了readlines()方法,来一行一行的读取文件.

with open('User/joe/Desktop/test1/py', 'r') as f:
    for line in f.readlines():
        print(line.strip())

file-like Object

像open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object.
StringIO就是在内存中创建的file-like Object,常用作临时缓冲。

  • 二进制文件

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

  • 字符编码

    要读取编码文件,需要在open()中传入encode参数,比如:

    f = open('/User/joe/Desktop/test1.py', encoding = 'gbk')
    f.read()
    

写文件

写文件与读文件一样,只不过在open()的标识符参数中传入 'w'或者'wb'即可.
然后调用write()方法,写出文件,最后调用close()文件关闭文件即可.

StringIO & BytesIO

很多时候读数据不一定是从文件中读, 还有可能从内存中读. 要读取StringIO,需要先从io中导入StringIO.

写入数据到StringIO中,需要先创建一个StringIO.然后像文件一样写入即可.调用getvalue()方法获得写入的str

from io import StringIO

f = StringIO()
f.write('Hello World')
print(f.getvalue())

从StringIO中读数据.使用str初始化一个StringIO,然后像读文件一样读取数据.

from io import StringIO

f = StringIO('Hello World')
f.read()

StringIO只能操作str类型的数据,如果要操作二进制数据则需要导入BytesIO

BytesIO实现了在内存中读写bytes,我们创建一个BytesIO,然后写入一些bytes

from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())

这里写入的经过encode编码的二进制数据

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

from io import BytesIO
f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')
f.read()

操作文件和目录

Python内置的os模块可以直接调用操作系统提供的接口函数来实现文件和目录的操作,操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中.

import os
# 查看当前目录的绝对路径:
os.path.abspath('.')
'/Users/joe/Desktop'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
os.path.join(os.path.abspath('.'), 'testdir')
'/Users/joe/Desktop/testdir'
# 然后创建一个目录:
os.mkdir('/Users/joe/Desktop/testdir')
# 删掉一个目录:
os.rmdir('/Users/joe/Desktop/testdir')

要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名.

os.path.split(/Users/joe/Desktop/testdir)

os.path.splitext()可以直接得到文件扩展名.

使用rename()对文件重命名和remove()删掉文件.

利用Python的特性来过滤文件。比如我们要列出当前目录下的所有目录,只需要一行代码:

[x for x in os.listdir('.') if os.path.isdir(x)] ['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]

要列出所有的.py文件,也只需一行代码:

[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'] ['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']

序列化

我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling.序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上.反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。

  • 序列化一个dict
import pickle
d = dict(name = 'joe', age = 24, score = 90)
pickle.dumps(d)

pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object.

import pickle
d = dict(name = 'joe', age = 24, score = 90)
f.open('hhh.py','wb')
pickle.dump(d, f)
f.close()

hhh.py中存储的就是dict被序列化的内容.

当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。我们打开另一个Python命令行来反序列化刚才保存的对象

f = open('hhh.py', 'rb')
d = pickle.load(f)
f.close()

这样变量的内容又回来,但是这个变量与之前的只是内容相同,并不是一个变量.

JSON

Python内置了Json模块,将dict转换为json的方法为:

import json
d = dict(name = 'joe', age = 24, score = 90)
json.dumps(d) 

dumps()方法返回一个str,内容就是标准的JSON.

反序列化是调用loads()方法

import json
json_str = dict(name = 'joe', age = 24, score = 90)
json.laods(json_str)

如果我们在dumps的可选参数deault中不传入任何参数,Python将无法知道怎么将一个class序列化,这时需要写一个转换函数来将class实例转化为json对象.
同样的道理,如果需要反序列化一个class,同样需要写一个转换函数,传到object_hook参数中.

import json

class Studnet(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

s = Student('Joe', 24, 90)

#要序列化s
def student2dict(std):
    return {'name': std.name, 'age': std.age, 'score': std.score}

json.dumps(s, default= student2dict)
# 序列化的结果
# '{"name": "Bob", "score": 90, "age": 20}'

# 反序列化
json_str = '{"name": "Bob", "score": 90, "age": 20}'
def dict2Student:(dic):
    return Student(dic['name'], dic['age'], dic['score'])

json.loads(json_str, object_hook= dict2Student)
# 反序列化的结果
#<__main__.Student object at 0x102af07f0>

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

推荐阅读更多精彩内容

  • IO编程概念 IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由C...
    时间之友阅读 719评论 0 0
  • 文件读写 读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。由于文件读写时都有可能产...
    时间之友阅读 454评论 0 0
  • python学习笔记 声明:学习笔记主要是根据廖雪峰官方网站python学习学习的,另外根据自己平时的积累进行修正...
    renyangfar阅读 3,016评论 0 10
  • 一、读文件 1、读取整个文件 准备好一个非空的txt文件 在Linux和Mac OS中,文件路径中使用斜杠(/),...
    SheHuan阅读 1,093评论 0 3
  • 性别女,爱好女 多点人站出来 我们越不需隐藏 然而发这条状态的我 还是屏蔽了175个人。 这是今天朋友圈看到的 我...
    呆丫阅读 116评论 0 0