python文件

IO在计算机编程中指的是输入和输出。IO编程中,Stream(流)是一个很重要的概念。IO有同步IO和异步IO两种,同步和异步的区别就在于是否等待IO执行的结果。读写文件是常见的IO操作。

1. 文件

1.1 打开文件

open():打开文件,返回一个stream(流对象)

使用方法:open(file, mode='r', buffering=None, encoding=None, errors=None...............)

  • file:文本文件、二进制字符串、文件路径(使用相对路径或绝对路径表示)
  • mode:打开文件的模式
    • r:读模式打开(默认)
    • w:写入模式打开,先清空文件,不存在则创建文件
    • x:创建新文件,以写入模式打开
    • a:以追加写入模式打开,不存在则创建文件
    • b:二进制模式打开
    • t:文本模式(默认)
    • +:读写模式打开
  • encoding:打开文件使用的编码(与写入文件使用的编码相同才能正常读取)
1.2 关闭文件
  • close():close()方法用来关闭文件
  • 建议完成操作后总是关闭文件,打开的文件会占用系统资源
file = open("test.txt")
# 操作
file.close()  # 关闭文件
  • try----finally方式:
try:
  file = open("test.txt")
    # 操作
finally:
  file.close()
  • with-----open-----as-------方式:推荐使用,会自动调用close()方法关闭文件
with open("test.txt") as f:
  # 操作
1.3 读取文件
  • read():一次读取所有内容并返回,适用于文件较小时使用
  • read(size):读取一定数量数据并返回。文本模式下(rt),表示读取指定字符数;二进制模式下(rb),表示读取指定字节数。UTF8编码下,英文字符一个字节,汉字三个字节
  • readline():读取一行并返回
  • readlines():读取所有行并以列表形式返回(包括换行符)
# 读取文件
# read():读取所有并返回,一般用于文件较小时读取
with open("python.txt", "r") as file:
    content = file.read()
    print(content)
# read(size):文本模式下读取指定字符数返回;二进制模式下表示读取指定字节返回(utf8编码,英文1个字节,汉字3个字节)
with open("python.txt", "r") as file:
    content = file.read(20)
    print(content)
    
with open("python.txt", "rb") as file:
    content = file.read(20)
    print(content)
    
# readline():读取一行并返回
with open("python.txt", "r") as file:
    line = file.readline()
    print(line)
    
# readlines():读取所有行包括换行符并以列表形式返回
with open("python.txt", "r") as file:
    line_list = file.readlines()
    print(line_list)
    
1.4 写入文件
  • write():写入字符串到文件,并返回写入的字符串数量(二进制模式返回写入的字节数)
# 写入文件:以写入模式(w,a,x,t,b)打开,使用write()方法进行写入,返回添加的字符数(二进制模式返回添加的字节数)
with open("python.txt", "a") as file:
    add_num = file.write("这是我自己添加的一行!!!")
    print(add_num)
    
with open("python.txt", "ab") as file:
    add_num = file.write("这是我自己添加的一行!!!".encode("utf-8"))
    print(add_num)
1.5 文件指针
  • tell():返回当前文件指针所在位置(字节数)
  • seek():修改文件指针位置(通过字节偏移量)
  • seek(self, offset: int, whence: int = 0)
    • offset:字节偏移量
    • whence:相对位置(默认为文件开始位置)0 文件开头 1 当前位置 2 文件末尾
with open("python.txt", "r") as file:
    print(file.tell())  # 起始指针位置
    file.read(20)  # 读取20个字符
    print(file.tell())  # 读取指定字符后指针位置(字节数)
    file.seek(0)  # 移动指针到指定位置(此处为文件开头)
    print(file.tell())  # 手动移动指针后指针位置
1.6 文件迭代
  • 基本概念:

    • 循环:满足条件的情况下,重复执行某段代码
    • 迭代:按照某种顺序访问线性结构中的每一项
    • 遍历:按一定规则访问非线性结构的每一项
    • 递归:一个函数不断调用自身的行为
  • 判断一个对象能否迭代

    from collections import Iterable
    isinstance(obj, Iterable)
    
  • iter():生成一个迭代器,使用next()函数不断获取下一个值

  • 按行迭代:

    # 文件迭代:按行迭代
    with open("python.txt", "r") as file:
        while True:
            line = file.readline()
            print(line)
            if not line:
                break
    
    with open("python.txt", "r") as file:
        for line in file:
            print(line)
    

2. StringIO和BytesIO

2.1 StringIO:在内存中读写str
from io import StringIO

file = StringIO("hello\n world \n name.")  # 创建StringIO对象并使用字符串进行初始化
print(file.read())  # 读取StringIO对象的内容

file.write("hello python")
print(file.getvalue())  # 获取StringIO对象写入后的内容
2.2 BytesIO:读写二进制数据
from io import BytesIO

file = BytesIO("你好".encode("utf-8"))  # 创建并初始化BytesIO对象
print(file.read().decode("utf-8"))  # 读取内容并解码

file.write("中国".encode("utf-8"))  # 向BytesIO对象写入内容(二进制,需要编码)
print(file.getvalue().decode("utf-8"))  # 获取写入后的内容并解码

3. 序列化与反序列化

把对象的状态信息变成可存储或传输的过程称之为序列化(二进制格式)。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。python使用pickle模块实现数据的简单序列化和反序列化。

3.1 序列化
  • pickle.dumps(obj):将对象序列化为bytes(此时可用wb格式打开文件并写入)
  • pickle.dump(obj, file):直接序列化并写入文件
# 序列化与反序列化
import pickle

# 序列化:将对象状态信息变为可存储或者可传输的过程称为序列化(变为二进制格式)
mydict = {"name":"fengdi", "age":22, "language":"python"}
mydict_pickle = pickle.dumps(mydict)  # 序列化为二进制模式,此时可写入文件或进行传输
print(mydict_pickle)

with open("pickle.txt", "wb") as file:  # 以二进制写入模式打开并写入
    file.write(mydict_pickle)
    
with open("pickle.txt", "rb") as file:
    content = file.read()
    print(content)

mylist = ["python", "java", 10, 20]  # 直接序列化对象并写入文件
with open("pickle.txt", "wb") as file:
    pickle.dump(mylist, file)
    
with open("pickle.txt", "rb") as file:
    content = file.read()
    print(content)
3.2 反序列化
  • pickle.loads(obj):反序列化bytes文件(应先从文件中读取出来)
  • pickle.load(file):直接从文件中读取bytes并反序列化
# 反序列化
with open("pickle.txt", "rb") as file:
    content = file.read()  # 二进制模式
    print(pickle.loads(content)) # 从二进制模式反序列化(需要先以二进制模式将内容读取出来)
    
with open("pickle.txt", "rb") as file:  # 直接从文件中反序列化为对象
    content = pickle.load(file)
    print(content)

4. python和json格式转换

  • json格式是标准格式,与python类型的对应关系:
python类型 json类型
dict { }
list [ ]
str " "
int float 1234.56
True False true false
None null
  • 转换方法和序列化反序列化类似:
    • json.dumps(obj):将python对象转换为json对象
    • json.dump(obj, file):将python对象转换为json对象并写入文件
    • json.loads(obj):将json对象转换为python对象 (应先从文件中读取出来)
    • json.load(file):直接从文件中读取并转换为python类型
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350