Python自学17(IO 操作)

Python自学17(IO 操作)_第1张图片
" 何顾远方,我心自有云白风清 "

不简单的输入输出:IO 操作

  • 1、文件读写
    • 1.1、打开文件
    • 1.2、写入文件
    • 1.3、读取文件
    • 1.4、关闭文件
  • 2、文件系统操作
    • 2.1、创建目录
    • 2.2、判断路径是否是一个目录
    • 2.3、列举目录下的内容
    • 2.4、删除目录
    • 2.5、创建文件
    • 2.6、判断路径是否是一个文件
    • 2.7、删除文件
    • 2.8、重命名文件
  • 3、序列化和反序列化
  • 4、pickle
  • 5、JSON

1、文件读写

1.1、打开文件

# 1. 在进行文件读写之前、有个重要的步骤——将文件打开
# 2. 同时指定针对文件的读写模式、比如只读、只写、可读可写等等
# 3. 只有先打开文件才能对文件进行读写操作

# 语法
打开文件使用内置函数 open()
# 1. open() 的返回值为 file 对象、也就是这里的变量 f
# 2. 利用这个对象、我们可以进行文件读写
f = open(r'文件路径', 读写模式)

f = open(r'C:\Users\hp\OneDrive\桌面\xiaohan', 'w')

# 读写模式有以下模式
# 1. 'r':只读、若文件不存在则抛出 FileNotFoundError 异常
# 2. 'w':只写、将覆盖所有原有内容、若文件不存在则创建文件
# 3. 'a':只写、以追加的形式写入内容、若文件不存在则创建文件
# 4. 'r+':可读可写、若文件不存在则抛出 FileNotFoundError 异常
# 5. 'w+':可读可写、若文件不存在则创建文件
# 6. 'a+':可读可写、写入时使用追加模式、若文件不存在则创建文件

# 1. 以上所有读写模式都是基于文本内容的
# 2. 如果想要读写二进制内容、可在上面的基础上添加 'b' 模式,如 rb、'wb+'

# 1. 上述打开方式默认使用 UTF-8 编码、如果文件内容并非 UTF-8 编码
# 2. 可以使用 encoding 参数指定编码格式
# 3. 如 f = open(r'C:\Users\hp\OneDrive\桌面\xiaohan', 'w', encoding='gbk')

1.2、写入文件

# 语法
length = f.write('内容')

f = open(r'C:\Users\hp\OneDrive\桌面\xiaohan', 'a+')
length = f.write('i love you')
# 写入文件后将返回字符串的长度
print(length)
f.close() # 关闭文件
# output:10

1.3、读取文件

# 语法
content = f.read()

%1
# 先将 i love youi love you写入文件
f = open(r'C:\Users\hp\OneDrive\桌面\xiaohan', 'r')
# 只读(r)
content = f.read()
print(content)
f.close() # 关闭文件
# output:i love youi love you

%2
# 1. 指定要读取内容的字符长度
# 2. 每次调用 f.read(30) 时都是从上一次读取的结束位置开始
# 3. 来读取新的内容、直至所有的内容被获取完、之后再调用 f.read(30) 只会得到空字符串 ''
# 4. 先将 i love youi love you写入文件
f = open(r'C:\Users\hp\OneDrive\桌面\xiaohan', 'r')
# 只读(r)
content = f.read(10)
print(content)
print(f.read(10))
f.close() # 关闭文件
# output:i love you
#        i love you

%3
# 语法
# 还可以按行来读取文件
line = f.readline()

# 1. 当文件'xiaohan'里面的内容为:
# 2. The quick brown fox
# 3. jumps over
# 4. the lazy dog

# 1. 先将
# 2. The quick brown fox
# 3. jumps over
# 4. the lazy dog
# 5. 写入文件
f = open(r'C:\Users\hp\OneDrive\桌面\xiaohan', 'r')
# 只读(r)
content = f.readline()
print(content)
print(f.readline())
print(f.readline())
f.close() # 关闭文件
# output:The quick brown fox
# 
#        jumps over
# 
#        the lazy dog

%4 
# 语法
# 按行读取文件还可以一次性将所有行读出、然后放进列表里
lines = f.readlines()

# 1. 先将
# 2. The quick brown fox
# 3. jumps over
# 4. the lazy dog
# 5. 写入文件
f = open(r'C:\Users\hp\OneDrive\桌面\xiaohan', 'r')
# 只读(r)
content = f.readlines()
print(content)
f.close() # 关闭文件
# output:['The quick brown fox\n', 'jumps over\n', 'the lazy dog']

1.4、关闭文件

  1. 每次打开文件后,无论进行了多少读写操作,最终都一定要将文件关闭
  2. 因为打开文件会消耗相关系统资源(文件描述符),不使用时应及时释放
# 语法 1
f.close()

# 语法 2
还有一种方式能自动关闭打开的文件、那就是使用 with 语句

with open(r'C:\Users\hp\OneDrive\桌面\xiaohanhan', 'w') as f:
    f.write('i love xiaohanhan')

# 1. open() 后的 file 对象会被 as 关键字赋予变量 f
# 2. 和之前一样、我们利用 f 进行文件读写
# 3. with 语句会在它的代码块执行完毕后、或代码块抛出异常时、自动关闭文件、为我们省却了 f.close() 步骤

2、文件系统操作

  • 文件系统操作需要使用内置的 os 模块

2.1、创建目录

# 语法
import os

os.mkdir(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu')

2.2、判断路径是否是一个目录

# 语法
os.path.isdir(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu')

import os
a = os.path.isdir(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu')
# 在 2.1 中创建的目录
b = os.path.isdir(r'C:\Users\hp\OneDrive\桌面\xianhanahan')
# 在 1.4 中创建的文件
print(a)
print(b)
# output:True
#        False

2.3、列举目录下的内容

# 语法
os.listdir(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu') 

import os
a = os.listdir(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu')
# 先在目录中建立 txt 文件 xiaowu 和 文件 xiaoki
print(a)
# output:['xiaoki', 'xiaowu.txt']

2.4、删除目录

%1
# 语法
# 删除目录 path、path必须是个空目录、否则抛出OSError异常
os.rmdir(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu')

%2
# 语法
import shutil

shutil.rmtree(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu')  # 删除test文件夹下所有的文件、文件夹

2.5、创建文件

# 语法
f = open(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu\xiaohanahan', 'w')
f.close()

2.6、判断路径是否是一个文件

# 语法
os.path.isfile(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu\xiaohanahan')

2.7、删除文件

# 语法
os.remove(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu\xiaohanahan')

2.8、重命名文件

# 语法
os.rename(r'C:\Users\hp\OneDrive\桌面\xianzhuzhu\xiaohanahan', 'xiaozizi')

3、序列化和反序列化

# 1. 程序运行时、产生的所有对象都位于内存之中
# 2. 内存有个特点、那就是它是非持久的
# 3. 如果程序运行结束或者计算机断电、占用的内存将被清空
# 4. 有时、我们需要把程序运行时内存中的对象、持久化下来保存在文件系统中、或者传输至网络

%1
# 将这样一个类的对象保存在文件中
class Pair:
    def __init__(self, first, second):
        self.first = first
        self.second = second

pair = Pair(10, 20)

# 1. 涉及到序列化和反序列化
# 2. 序列化是将内存中的对象转换为可被存储或可被传输的形式的过程
# 3. 反序列化是将序列化后的内容恢复回内存中对象的过程

4、pickle

# 1. Python 中内置的 pickle 模块用作序列化和反序列化
# 2. 它的序列化结果是二进制形式

# 语法1 序列号
import pickle

some_bytes = pickle.dumps(对象)

# 语法2 反序列号
import pickle

对象 = pickle.loads(some_bytes)

%1
import pickle

class Pair:
    def __init__(self, first, second):
        self.first = first
        self.second = second

pair = Pair(10, 20)
some_bytes = pickle.dumps(pair)
print(some_bytes)
# output:b'\x80\x03c__main__\nPair\nq\x00)\x81q\x01}q\x02(X\x05\x00\x00\x00firstq\x03K\nX\x06\x00\x00\x00secondq\x04K\x14ub.'

# 上面输出的乱码便是 pair 对象被序列化后的二进制

%2
# 刚才序列化后的结果、可以使用 pickle.loads() 将其反序列化回对象
import pickle

class Pair:
    def __init__(self, first, second):
        self.first = first
        self.second = second

pair = Pair(10, 20)
some_bytes = pickle.dumps(pair)
# 序列化
print(some_bytes)
pair = pickle.loads(some_bytes)
# 反序列化
print(pair.first)
# output:b'\x80\x03c__main__\nPair\nq\x00)\x81q\x01}q\x02(X\x05\x00\x00\x00firstq\x03K\nX\x06\x00\x00\x00secondq\x04K\x14ub.'
#        10

%3
# 1. 也可以与 open() 相结合、将序列化的结果保存在文件中
# 2. 此时使用 pickle.dump()(注意与之前的 pickle.dumps() 不同)

with open(r'C:\Users\hp\OneDrive\桌面\xiaohanhan', 'wb') as f:
# 以二进制只写
    pickle.dump(pair, f)
 
%4
# 1. 从文件中反序列化出对象
# 2. 使用 pickle.load()(注意与之前的 pickle.loads() 不同)

with open(r'C:\Users\hp\OneDrive\桌面\xiaohanhan', 'rb') as f:
    pair = pickle.load(f)

5、JSON

# 1. pickle 使用 Python 专用的序列化格式
# 2. 序列化后的结果无法做到跨语言使用
# 3. 另外其序列化结果是二进制、不适合阅读

# 1. JSON 相对而言更加通用和流行、并且其结果为文本格式、更具可读性
# 2. 同样是刚才的 pair 对象、可以像这样将它序列化为 JSON 字符串

# 语法
import json

json_string = json.dumps(pair.__dict__)

%1
json_string'{''firs'': 10,''secon'': 20}'
# 1. 这里使用了 pair.__dict__ 来获取包含所有 pair 属性的字典
# 2. 因为类对象不能直接用于 json.dumps() 序列化、而字典可以

# 1. 或者使用 default 参数、向 json.dumps() 告知如何进行从对象到字典的转换
# 2. 这样便可以不使用 __dict__ 属性

%2
def pair_to_dict(pair):
	return {
     
		'first': pair.first,
		'second': pair.second,
	}

json_string = json.dumps(pair, default=pair_to_dict)

%3
# 从 JSON 反序列化为对象
def dict_to_pair(d):
    return Pair(d['first'], d['second'])

pair = json.loads(json_string, object_hook = dict_to_pair)

# 1. 上述反序列化过程中、json.loads() 首先会将 JSON 字符串反序列化为字典
# 2. 然后使用 object_hook 参数进一步从字典转换出 pair 对象

%4
# 1. 与 pickle 相似、json 也可以与 open() 结合使用、将序列化的结果保存在文件中
with open(r'C:\Users\hp\OneDrive\桌面\xiaohanhan', 'w') as f:
    json.dump(pair, f, default=pair_to_dict)

%5
# 从文件中反序列化出对象
with open(r'C:\Users\hp\OneDrive\桌面\xiaohanhan', 'r') as f:
    pair = json.load(f, object_hook=dict_to_pair)

你可能感兴趣的:(Python自学,python,json,os)