【python】IO编程

文章目录

  • 文件读写
  • StringIO
  • BytesIO
  • 文件和目录
  • 序列化
  • JSON

文件读写

try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

简化为下面的语法糖

with open(r"C:\test\test.txt", 'r') as f:
    for line in f.readlines():
        print(line.strip())  # 把末尾的'\n'删掉

这个文件中,每行的末尾都有一个看不见的换行符,而print 语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print 语句。

调用read()会一次性读取文件的全部内容,但如果文件有10G,内存就爆了。所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

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

非UTF-8编码的文本文件,需要给open()函数传入encoding参数

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

f=open(r"D:\c盘来的\共享文件\bz\col.jpg","rb")
g=open("pic.jpg","wb")
while(1):
    a = f.read(8)
    if(not a):
        break
    g.write(a)
f.close()
g.close()

StringIO

from io import StringIO
f = StringIO()
f.write('hello')
print(f.getvalue())
f.close()

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

from io import StringIO
f = StringIO('Hello!\nGoodbye!')
s = f.readlines()
for i in s:
    print(i.strip())
f.close()

BytesIO

StringIO操作的只能是str,如果要操作二进制数据,就需要使用BytesIO

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

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

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

File.seek(1) File.seek(2) 0指针回到文件开头 1当前位置 2文件结尾

import io
# 写入二进制数据到 BytesIO 对象中
data = b"Hello, World!"
bio = io.BytesIO()
bio.write(data)
# 从 BytesIO 对象中读取二进制数据
bio.seek(0)
read_data = bio.read()
print(read_data)

在 Python 中,以 b 开头的字符串表示的是二进制字符串(bytes)。这种字符串是由字节组成的,每个字节都有一个对应的整数值,范围在 0 到 255 之间。二进制字符串与普通字符串不同,因为普通字符串是由 Unicode 字符组成的,每个字符都对应一个 Unicode 码点。

将二进制字符串转换成普通字符串,可以使用字符串的 decode() 方法。decode() 方法将一个字节串(bytes)转换成一个字符串(str),需要指定一个编码方式。在不知道编码方式的情况下,可以使用默认编码方式(通常为 UTF-8)

read_data = bio.read().decode()

文件和目录

import os
print(os.path.abspath('.'))
a=os.path.join('D:\c盘来的\py\pycharm', 'mypro\coleak')
print(a)
# os.mkdir(a)
os.rmdir(a)

os.path.split() 函数可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名

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

输出所由目录

import os
for x in os.listdir('.'):
    if os.path.isdir(x):
        print(x)

序列化

import pickle
d = dict(name='coleak', age=20, score=88)
e={"name":"coleak","age":19}
print(type(e))
print(pickle.dumps(d))
e=pickle.dumps(e)
print(pickle.loads(e))

存储到文件

import pickle
d = dict(name='Bob', age=20, score=88)
pickle.dumps(d)
f = open('a.txt', 'wb')
pickle.dump(d, f)
f.close()
f = open('a.txt', 'rb')
d = pickle.load(f)
print(d)
f.close()

JSON

import json
d = dict(name='Bob', age=20, score=88)
print(json.dumps(d))

f = open('a.txt', 'rb')
d = pickle.load(f)
print(d)
f.close()

你可能感兴趣的:(#,python,python,开发语言)