Python IO 流

转载请注明出处


读文件

输入输出流 (以python的角度)
read 文件是 输入流,
my_file=open(filename,encoding='utf8')
  • 读取整个文件
data=my_file.read() # 一次性 读完整个文件 文件指针在结尾
  • 分段读取
data=my_file.read(2) # 一次读两个字符 
文件指针在第二个字符后面

for item in data:
    print(item)
# 一次性读取一个字符


while True:
    data=my_file.read(2)   # 一次读取两个字符 你读取字符就是字符数,如果你加上b 以字节读取就是字节数

    if not data:
        break
    print(data)
  • 按行读取代码
f = open("D:/aipai.sql", 'r', encoding='utf8')
# 文件时一个可迭代对象
for line in f:
    print(line)
with open("file") as fh:
    line = fh.readline()
    while line:
        line = fh.readline()
  • 按行读取
data=my_file.readline() # 一次读取一行 包含换行符
data=my_file.readline(2) # 读取一行中的几个字符
data=my_file.readlines() # 读取所有行 返回一个列表
  • 二进制读取
file=open(r'd:\test.png','rb')
data=file.read()  # 一次读取整个文件
data=file.read(2) # 一次读取2个字节

写文件

  • 文本写出
data='Hello'
file=open(filename,'w',encoding='utf8')
file.write(data)   # 会覆盖原来文件,没有则新建
writelines(['a','b'])  使用列表来写入
  • 追加文件
data='Hello'
file=open(filename,'a')
file.write(data) # 追加到原来文件里面
  • 二进制写出
data='你好'.encode('uft8')  #   bytes 类型
file=open(file_name,'wb')
file.write(data)
  • 二进制追加
data='你好'.encode('uft8')  #   bytes 类型
file=open(file_name,'ab')
file.write(data)

模式  可做操作     若文件不存在 是否覆盖
r        只能读       报错          -
r+       可读可写      报错         是
w        只能写       创建         是
w+        可读可写     创建            是
a      只能写     创建         否,追加写
a+       可读可写      创建         否,追加写

读写内存

from io import BytesIO
from io import SringIo

字符串和字节类似
读

with BytesIO(b'abc') as b:
    data=b.read()
写

with Bytes() as b:
    b.write(b'abc')
    print(b.getvalue())  读取内存中的内容
  • 定位读取
f=open()
f.seek(3,0)   # 3表示相对于起点的偏移量 第二个参数
0 表示从文件起点开始
1 表示从当前位置开始
2 表示从文件末尾开始

如果要使用 seek(5,1) 就是 后面使用非0 的参数那么就要用 二进制的方式读取文件

f.tell()  # 返回当前的位置

os 模块

  • 系统
import os
os.name  # 系统名称
e=os.environ # 环境变量
os.system()   # 执行系统命令
os.popen()    # 执行系统命令
print(e.get('path'))
  • 目录操作
os.listdir()    # 列出当前目录的文件
os.listdir('.') # 列出当前目录的文件
os.listdir('..')# 返回父目录名称
os.path.abspath('.') # 返回当前目录的绝对路径
括号里面必须要加参数
os.mkdir('test')  # 新建文件夹
  • 其他
os.paht.exists('a.txt')
os.path.split(r'\123\456\test.txt'') # 路径一分为二
os.path.join(dir,file)  # 跨平台文件名称连接
  • 删除操作
os.remove('test.txt')   # 删除文件
os.rmdir('删除空目录')
  • 重命名
os.rename(old_name,new_name)
  • 遍历目录
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])  -->生成器
paths = os.walk(r'D:\000_laopei_python',onerror=None)
print(next(paths))

# 获取了指定目录的所有路径
import os
for root, dirs, files in os.walk(r"D:\000_laopei_python\day10", topdown=False):
    for name in files:
        print(os.path.join(root, name))
    for name in dirs:
        print(os.path.join(root, name))


root 是当前目录名称、dirs 是当前目录下的子目录列表、files是当前目录下的文件列表


shutil 模块

shutil.copyfile(src,dest) # 文件复制

自行上网搜索

pickle

  • 序列化
import pickle
L=[1,2,3,4]
# 序列化到文件  文件是二进制写入模式 wb
with open(r'C:\Users\Stefan Salvatore\Desktop\1.txt','wb') as f:
    pickle.dump(L,f)
    
# 序列化到内存 
L=[1,2,3]
msg=pickle.dumps(L)    # msg是存对象的内存
  • 反序列化
# 从文件反序列化 文件是二进制读取模式 rb
with open(r'C:\Users\Stefan Salvatore\Desktop\1.txt','rb') as f:
    data=pickle.load(f)
    print(data)
# 从内存反序列化
data=pickle.loads(msg)   # msg是之前的的内存
print(data)

json 文件传输格式

  • 序列化
# 序列化到文件 文件是字符串写入模式 w  文件内存是 [1,2,3] 的字符串
L=[1,2,3]
with open(r'C:\Users\Stefan Salvatore\Desktop\1.txt','w') as f:
    json.dump(L,f)
# 序列化到内存 
L=[1,2,3]
msg=json.dumps(L)   # msg是内存
# 序列化对象
  • 反序列化
# 从文件反序列化
with open(r'C:\Users\Stefan Salvatore\Desktop\1.txt','r') as f:
    data=json.load(f)
    print(data)
# 从内存反序列化
data=json.loads(msg)
print(data)

你可能感兴趣的:(Python IO 流)