Python文件写入读取,文件复制以及一维,二维,多维数据存储

基础解释

在 Python 中,文件操作的模式除了 w (只写)、 a (追加写)、 r (只读)外,还有以下几种常见模式:

-  r+ :可读可写。该文件必须已存在,写操作是追加在文件内容末尾。若先读后写,写入时是从文本最后面开始追加;若先写后读,从文本开头写入时会覆盖对应个数的字符。
-  w+ :写读模式。打开创建新文件并写入数据,如果文件已存在,则覆盖写。无论是先写后读还是先读后写,刚打开文件时读取内容都为空,因为写入操作会清空原内容。若要读取完整内容,需将光标移到首位,可使用 f.seek(0) 方法。
-  a+ :追加读写模式。打开文件的方式与写入方式和 a 一样,如果文件不存在则创建新文件,不会清空原内容,写入内容会追加在文件末尾。但刚用 a+ 打开一个文件时,一般不能直接读取,因为此时光标在文件末尾,除非把光标移动到初始位置或任意非末尾的位置,可使用 seek() 方法解决。
-  rb :以二进制方式读取文件。该文件必须已存在。
-  wb :表示以二进制写方式打开,只能写文件,如果文件不存在,创建该文件;如果文件已存在,则覆盖写。
-  ab :以二进制追加模式打开,若文件不存在则创建新文件,用于以二进制形式在文件末尾追加数据。
 
总结来说,这些模式可以分为三大类:读 r (read)、写 w (write)、追加 a (append),后面加 b 表示以二进制形式操作文件,加 + 表示可读可写。

文件写入

示例代码:写入列表和直接写入文字不一样

def my_write(s):
    file=open("a.txt","a",encoding="utf-8")
    file.write(s)
    file.write('\n')
    file.close()
def my_write_lst(file,lst):
    f=open(file,"w",encoding="utf-8")
    f.writelines(lst)
    f.close()
if __name__ == '__main__':
    my_write("伟大的航天梦")
    my_write("北京欢迎你")
    lst=["姓名\t","年龄\n","张三\t","18\t"]#只能为字符串
    my_write_lst("c.txt",lst)

代码结果:

并不是都是,为了方便都截图了,找到自己创建的文件,open是打开,在文件不存在时会自动创建,点开文件查看结果即可。

文件的读取操作

示例代码:

def write_read(filename):
    file=open("d.txt","w+",encoding="utf-8")
    file.write("你好啊")#写入完成,文件的指针在最后
    #seek  修改文件指针的位置
    file.seek(0)
    # s=file.read()#读取全部内容
    # s=file.read(1)#读取一个字符
    # s=file.readline()#读取一行
    # s=file.readline(1)#读取一行的几个字符
    # s=file.readlines()#一行为一个列表的元素,返回值为列表
    #读取“好啊”,要移动指针的位置
    file.seek(3)#3表示三个字节,utf-8一个中文3个字节
    s=file.read()
    print(type(s),s)
    file.close()
if __name__ == '__main__':
    write_read("d.txt")

代码结果:先写入

文件的复制

示例代码:两个路径

def copy(src,new_file):
    #打开原文件
    file1=open(src,"rb")#rb为按二进制读取
    #打开目标文件
    file2=open(new_file,"wb")
    #边读边写
    s=file1.read()
    file2.write(s)
    file2.close()
    file1.close()#先打开的后关,后打开的先关
if __name__ == '__main__':
    src="./百度.png"#.代表的是当前目录
    new_file="../第十章/copy_百度.png"#两个点表示上级目录,相当于Windows的后退
    copy(src,new_file)
    print("复制完成")

代码结果:

admin是一个包,没有关系。

with语句

示例代码:简化读写代码过程,自动关闭文件

def write_fun():
    with open("aa.txt","w",encoding="utf-8") as file:
        file.write("北京欢迎你")
def read_fum():
    with open("aa.txt","r",encoding="utf-8") as file:
        print(file.read())
def copy(src,target):
    with open(src,"r",encoding="utf-8") as file1:
        with open(target,"w",encoding="utf-8") as file2:
            file2.write(file1.read())
if __name__ == '__main__':
    write_fun()
    read_fum()
    copy("./aa.txt","./dd.txt")

效果和前面差不多,就就不展示了,方便很多。

一维和二维数据的储存和读取

示例代码:
 

#一维数组的存储
def write_list():
    #一维数据,可以是集合,元组,列表
    lst=["陈俊宇","李佳怡","李静怡","蔡健雅"]
    with open("一维.txt","w",encoding="utf-8") as file:
        file.write(",".join(lst))
def read_list():
    with open("一维.txt","r",encoding="utf-8") as file:
        s=file.read()
        lst=s.split(",")
        print(lst)
def write_list2():
    lst=[["姓名","学号","排名"],
         ["李静怡","001","12"],
         ["蔡健雅","002","13"]]
    with open("二维.txt","w",encoding="utf-8") as file:
        for item in lst:
            line=",".join(item)
            file.write(line)
            file.write("\n")
def read_list2():
    data=[]
    with open("二维.txt","r",encoding="utf-8") as file:
        lst=file.readlines()#每一行的元素为一个列表
        for item in lst:
            new_lst=item[:len(item)-1].split(",")
            data.append(new_lst)
    print(data)
if __name__ == '__main__':
    write_list()
    read_list()
    write_list2()
    read_list2()

代码结果:先写入后读取

多维数据的存储和读取

示例代码:

import json
#准备高维数据
lst=[
    {"lys":10,"cxx":20},
    {"lsk":20,"skk":55},
    {"lsl":55,"jsh":44},
    {"ksk":44,"skp":55}
]
s=json.dumps(lst,ensure_ascii=False,indent=4)#ensure_ascii使其正常显示中文,indent可以增加缩进,美观
print(type(s))#编码
print(s)#编码 list>str,原本是字典
#解码
lst2=json.loads(s)
print(type(lst2))
print(lst2)
print()
#编码到文件中
with open("多维数据.txt","w+",encoding="utf-8") as file:
    json.dump(lst,file,ensure_ascii=False,indent=4)
with open("多维数据.txt","r",encoding="utf-8") as file:
    lst3=json.load(file)
    print(lst3)

代码结果:解码和读取出来的结果是一样的,是列表,但是编码数据类型是字符串,显示出来是列表的样式。

<class 'str'>
[
    {
        "lys": 10,
        "cxx": 20
    },
    {
        "lsk": 20,
        "skk": 55
    },
    {
        "lsl": 55,
        "jsh": 44
    },
    {
        "ksk": 44,
        "skp": 55
    }
]
<class 'list'>
[{'lys': 10, 'cxx': 20}, {'lsk': 20, 'skk': 55}, {'lsl': 55, 'jsh': 44}, {'ksk': 44, 'skp': 55}]

[{'lys': 10, 'cxx': 20}, {'lsk': 20, 'skk': 55}, {'lsl': 55, 'jsh': 44}, {'ksk': 44, 'skp': 55}]

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值