【python语法】文件读写

在对文件进行读写操作之前,需要先打开一个文件(或者创建一个文件),可以使用file对象进行一系列的文件操作

打开(创建)文件

使用open()函数打开或者创建一个文件常见的语法格式:

file = open(filepath,mode)
  • filepath : 打开或者创建的文件的路径(精确到对应的文件名称)
  • mode:打开文件的模式
模式描述
r以只读的方式打开文件。文件的指针会放在文件的开头
rb以二进制格式打开一个只读文件用于只读,文件指针会放在文件的开头(默认放在开头)
r+打开一个文件用于读写,文件的指针将放在开头
rb+以二进制格式打开一个文件用于读写,文件的指针将放在开头
w打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
文件写入(中文编码)

在写入中文文档的时候最明显的问题是文件的编码问题;因为python默认编码方式是utf-8所以可能会导致出现编码失败之类的异常(比如目标文件以gbk的形式进行编码)注意:文件写入操作通常以打开(创建)文件开始、以关闭文件(close())结束

常用的写入方法:

file.write(content.encode("mode","errors"))
  • content:需要写入的内容
  • encode() : 编码方式(该函数常用两个参数)
  • mode :编码方式
  • errors:错误处理方式,常用的方式有:ignorestrict;其中ignore忽视编码过程中文件转码的错误,常用于强行写入文件和用于忽略部分小错误(更常用)
file = open(r"G:\新建文件夹\python\python_examples\days10\文件读写\newCN.txt", "wb")  # 写入中文一般是以二进制形式写入(否则肯恩韩国会出现编码异常)
print("开始写入")
mystr = '''
一位python程序员的七夕情书
我能抽象出整个世界...
但是我却不能抽象出你...
你肯定是一个单例,因为你是那样的独一无二...
所以我的世界并不完整...
我可以重载甚至覆盖这个世界里的任何一种方法...
但是却不能覆盖对你的思念...
也许命中注定了 你与我存在于不同的包里…
在你的世界里,你被烙上了私有的属性...
我用尽全身力气,也找不到访问你的接口...
我不愿就此甘心,找到了藏身在AI神殿的巫师,教会了我穿越时空的方法...
终于,我用反射这把利剑,打开了你空间的缺口...
并发现了接近你的秘密...
当我迫不及待地调用了爱你这个方法...
并义无返顾的把自己作为参数传进这个方法时...
我才发现爱上你是一个没有终止条件的递归...
它不停的返回我对你的思念并压入我心里的堆栈...
在这无尽的黑夜中 ,终于体验到你对我爱的回调…
我的内存里已经再也装不下别人...
当我以为将与你在这个死循环中天荒地老时…
万恶的系统抛出了爱的异常...
此刻我才发现,我不过是操纵于虚拟机下的一个线程,你也是...
但我毫不后悔,因为在爱的洗礼之后…
我看见了一个新的生命,那是我们的, 继承
我才发现爱上你是一个没有终止条件的递归...   
它不停的返回我对你的思念并压入我心里的堆栈...   
在这无尽的黑夜中 ,终于体验到你对我爱的回调... 
这个程序是怎么实现的呢?哪位python牛人解析下
'''
file.write(mystr.encode("utf-8", "ignore"))  # python默认的编码方式是utf-8
print("完成写入")
file.close()
# 文件写入如果出现编码方式错误,添加ignore参数
file = open(r"G:\新建文件夹\python\python_examples\days10\文件读写\gbkwrite.txt", "wb")  # 打开文件,如果不存在会在对应的目录下直接创建
file.write(mystr.encode("gbk", "ignore"))
file.close()  # 文件处理的最后一步都是关闭文件

在文件操作中,默认的写入方式是先将对应的编码内容写入缓存区,再关闭文件之后,将内容写入对应的文件(如果close()没有执行,则文件中不会出现任何数据);可以通过flush()函数刷新当前操作情况,从而实现实时写入

file = open(r"G:\新建文件夹\python\python_examples\days10\文件读写\实时写入.txt", "wb")
file.write(mystr.encode("utf-8", "ignore"))
file.flush()  # flush():刷新函数:将文件的写入模式修改为实时写入
file.close()  # 文件写入的最后一步必须是close()
读取文件的几种形式

读取文件的时候经常调用以下函数进行读取

file.read()  # 读取文件全部内容
file.read(n)  # 读取到文件的第n个字符
file.readline()  # 读取一行(包含换行符)
file.readlines()  # 将文件中的所有内容返回一个列表,每个列表元素代表一行(列表元素都是字符串)

实现自动readline()

filepath = r"G:\新建文件夹\python\第一阶段视频\001现阶段要看的材料\52G葫芦娃\163com\163com300.txt"
file = open(filepath, "rb")
for line in file:  # readline() 函数的实现方法
    print(line)
file.close()
# windows 中读取文件的指令为 type:用法:type 文件名
pickle模块保存对象

pickle 模块的作用是将文件对象保存到指定的文件中,进行文件与对象的交互动作;常用函数:

dump(obj,file):  # 保存对象到文件
load(file):  # 从文件中将对象读取出来
  • file: 文件对象,通常指的是调用open()函数的文件对象
  • obj:需保存的对象(列表、字典、集合等)

展示保存和读取一个对象:

import pickle

'''
写入操作
'''
mylist = [[1, 2, 3, 4, 5, 60], ["jjjjj", "pppppp", "ooooo"]]
file = open(r"G:\新建文件夹\python\review and test\Review1\文件读写\obj.bin", "wb")
pickle.dump(mylist, file)  # 向目标文件中写入对象,第一个参数是要写入的对象名、第二个参数:要写入的目标文件(调用open的文件对象)
file.close()

'''
读取操作
'''
file = open(r"G:\新建文件夹\python\review and test\Review1\文件读写\obj.bin","rb")
testList = pickle.load(file)  # 从目标文件中读取对象,参数是目标文件
print(testList)
file.close()
文件指针与偏移量

文件指针:代指在一段文本文件中光标的位置;常用函数seek()|tell()

file.seek(num,tag)
file.tell()
  • num:偏移的字节数量
  • tag:常用的有 0 (代表从起始位置开始) 2 (代表从文件末尾开始python36的io已经不支持)常用的就只有0
file = open(r"G:\新建文件夹\python\第一阶段视频\001现阶段要看的材料\day11\hcq.txt")
file.seek(16, 0)  # 从头开始,跳过 16 个字符;再读取一行
print(file.readline())
print(file.tell())  # 获取当前文件指针的位置
脚本文件指令的输入与输出

在运行python脚本的时候 < 代表从指定文件获得输入 > 代表将结果以写入模式(会覆盖之前的结果)输出到指定文件 ; >> 代表以追加模式输出到指定文件(不会覆盖之前的结果)

import os
strcmd = input("please input your command:")
os.system(strcmd)
print(strcmd)

在命令行中输入以下指令

C:\Users\Liulo\Desktop>python testouter.py < 1.txt  # 从 1.txt中获取输入的指令
C:\Users\Liulo\Desktop>python testouter.py < 1.txt > 2.txt  # 将刚刚的执行结果输出到 2.txt中
C:\Users\Liulo\Desktop>python testouter.py >>2.txt  # 在 2.txt中追加新的结果
tasklist
大数据查询模拟

需求:从一群数据中根据人名筛选出对应的记录,并将对应的记录以“人名.txt”的形式保存到一个新的文件中:

import codecs


def loaddata():
    file = codecs.open(r"G:\新建文件夹\python\第一阶段视频\20170424\vedio\大数据相关数据\kaifanglite.txt", "rb", encoding="gbk",
                       errors="ignore")
    # for line in file:  硬盘模式遍历数据
    #     print(line, end="")
    global datalist
    datalist = file.readlines()  # 将所有待查找人信息存储到列表中(加载到内存中)||内存模式
    # print(datalist)
    file.close()


def searchnames(datalist, name):
    for i in datalist:
        if str(i).find(name) != -1:
            print(i)  # 检验是否查询到对应的目标
            savefile(name, i)


def savefile(name, i):
    file = open("G:\\新建文件夹\\python\\review and test\\Review1\\" + str(name) + ".txt", "wb")
    file.write(str(i).encode("gbk"))
    file.close()


if __name__ == '__main__':
    datalist = []  # 用于存储所有待查找人的信息
    print("开始加载数据")
    loaddata()
    print("数据加载完毕")
    name = input("请输入目标名称:")
    searchnames(datalist, name)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值