Python中常见文件操作,纯干货_python 文件操作-程序员宅基地

技术标签: python  容易让人忘记的知识点  开发语言  

一、关于文件

  • 文件的作用:把一些数据储存起来
  • 使用文件流程:
    • 打开文件,读写文件,关闭文件

二、读写文件简单操作

  • 1.读取文件

    #打开文件
    file = open("demo1/1.txt",mode="r")
    #读取文件
    ret = file.read()  #file只是变量,read是读取函数
    print(ret)
    #关闭文件
    file.close()
    #第一个参数的文件的路径
    #第二个参数mode=访问文件的模型,r表示读,默认是r模式
    
  • 2.写入文件

    2.写文件 write
    file = open("demo1/1.txt",mode="w")
    file = open("demo1/111.txt",mode="w") #文件不存在,会自动创建
    file = open("demo2/111.txt",mode="w") #不会创建目录
    file.write("huangzhi")
    file.close()
    

三、文件权限

  • rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。一般用于 非文本文件如图片等。
    注意:二进制文件把内容表示为一个特殊的 bytes 字符串类型。

    # file = open("demo1/1.txt","rb")
    file = open("demo1/1.png","rb")
    ret = file.read()  #b'huangzhi'   huangzhi
    print(ret)
    file.close()
    
  • r+ 打开一个文件用于读写。文件指针将会放在文件的开头。

    file = open("demo1/1.txt","r+")
    # ret = file.read() #读取全部内容
    # print(ret) 
    file.write("guyin") #从头写入,原有内容会逐渐被覆盖
    file.close()
    
  • rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于 非文本文件如图片等。

  • wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。

    from demo1.img import img2
    file = open("demo1/2.jpg","wb")
    file.write(img2)
    file.close()
    
  • w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即 原有内容会被删除。如果该文件不存在,创建新文件。

    file = open("demo1/1.txt","w+")
    file.write("hello world")
    ret = file.read()
    print(ret)
    file.close()
    
  • a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。
    也 就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件 进行写入。

    #在demo1下的111.txt中追加“guyin”
    # file = open("demo1/111.txt","a")
    file = open("demo1/3.txt","a")
    file.write("guyin")
    file.close()
    
  • ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文 件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在, 创建新文件进行写入。

  • a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。
    文 件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

    file = open("demo1/111.txt","a+")
    file.write("yangyong")
    ret = file.read()
    print(ret)
    file.close()
    
  • ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文 件的结尾。如果该文件不存在,创建新文件用于读写。

四、文件高级操作

  • 调用 read()会一次性读取文件的全部内容,如果文件有 10G,内存就爆了,会导致程序卡死,
    所以,要保险起见,可以反复调用 read(size)方法,每次最多读取 size 个字符的内容

    file = open("demo1/111.txt","r")
    ret1 = file.read(5)
    ret2  = file.read(5)
    # print(ret1)
    print(ret2)
    file.close()
    
  • readline 每次读取一行,并且自带换行功能 每一行末尾会读到\n可以指定每行读取的字符长度,下一次读取会从此位置开始

    f = open("demo1/4.txt","r")
    # ret = f.read()
    print(f.readline(3))
    print(f.readline(3))
    print(f.readline(3))
    f.close()
    
  • readlines,一次性以行的形式读取文件的所有内容并返回一个 list,需要去遍历读出来

    f = open("demo1/4.txt","r")
    ret = f.readlines()
    # print(ret)
    for i in ret:
        print(i,end='')
    f.close()
    
  • file 句柄是一个可迭代的对象因此,可以循环读取文件中的内容,每次读一行

    f = open("demo1/4.txt","r")
    # print(f) #文件句柄,是一个可迭代对象
    for i in f:
        print(i)
    f.close()
    
  • write和writelines(多行一次性写入)

    file = open("demo1/5.txt","w")
    # file.write("yangyong")
    # file.write("zhuzucheng")
    
    # lst = ["yangyong","zhuzucheng"] #列表中必须是字符串
    lst = ["yangyong","zhuzucheng",10]
    # for i in lst:
    #     file.write(i)
    file.writelines(lst)
    file.close()
    
  • cvs文件读写

    • 写入 CSV 文件 必须创建 csv 模块中对应的 writer 对象,通过 writer 对象完成文件内容的写入操作
    f = open("demo1/movie.csv","w",newline='')
    writer = csv.writer(f)
    writer.writerow(["电影名称","评分","演员","网址"])
    writer.writerows([["唐人际探案1","8.5","刘昊然","www.movei1.com"],
                    ["唐人际探案2","8.6","刘昊然","www.movei2.com"],
                    ["唐人际探案3","8.7","刘昊然","www.movei3.com"]])
    f.close()
    
    • 读取 csv 文件的操作,主要通过 csv 模块中的 reader 对象来完成,通过加载文件数据到 reader 对象中,文件中的数据就会按照固定的格式读取到程序中进行处理
    f = open("demo1/movie.csv","r",newline='')
    reader = csv.reader(f)
    # print(reader) #<_csv.reader object at 0x0000000001EACCE0>
    for i in reader:
        print(i)
    f.close()
    

    将豆瓣电影写入csv文件:电影名称,评分,演员,网址

    from demo1.movie import movie_dict2
    print(movie_dict2)
    for i in movie_dict2["data"]: #遍历列表,取出字典对应的数据
        print(i['title'],i['rate'],i['casts'],i['url'])
    
    f = open("demo1/movie2.csv","w",newline='')
    writer = csv.writer(f)
    writer.writerow(["电影名称","评分","演员","网址"])
    for i in movie_dict2["data"]:
        movie_name = i['title']
        rate = i['rate']
        casts = i['casts']
        url = i["url"]
        writer.writerow([movie_name,rate,casts,url])
    f.close()
    

五、大文件的读取

如果文件不是很大的话,这种做法能够保证读取的速度,但是如果文件内容很大,大到差不多内存那么大或者更大的时候,就不能这么做了。但是 Python 早就替你考虑到了,Python 中有一个 fileinput 模块,可以使用它来操作。

import fileinput
with fileinput.input(files='text.html') as f:
    for line in f:
        print(line,end="")

当出现如下错误:
UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x80 in position 1517: illegal multibyte sequence
可以说明其编码有问题,我们可以将其转换成utf8,具体措施如下:

import fileinput

with fileinput.input(files='text.html',openhook=fileinput.hook_encoded("utf8")) as f:
    for line in f:
        print(line,end="")

基本方法

fileinput.input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)
files:                  #文件的路径列表,默认是stdin方式,多文件['1.txt','2.txt',...]
inplace:                #是否将标准输出的结果写回文件,默认不取代
backup:                 #备份文件的扩展名,只指定扩展名,如.bak。如果该文件的备份文件已存在,则会自动覆盖。
bufsize:                #缓冲区大小,默认为0,如果文件很大,可以修改此参数,一般默认即可
mode:                   #读写模式,默认为只读
openhook:               #该钩子用于控制打开的所有文件,比如说编码方式等;

常用函数

fileinput.input()       #返回能够用于for循环遍历的对象
fileinput.filename()    #返回当前文件的名称
fileinput.lineno()      #返回当前已经读取的行的数量(或者序号)
fileinput.filelineno()  #返回当前读取的行的行号
fileinput.isfirstline() #检查当前行是否是文件的第一行
fileinput.isstdin()     #判断最后一行是否从stdin中读取
fileinput.close()       #关闭队列

六、大文件的读取其他方式

def get_lines():
	with open('file.txt','rb') as f: 
		return f.readlines()
if name == ' main ': 
	for e in get_lines():
		process(e) # 处理每一行数据

现在要处理一个大小为10G的文件,但是内存只有4G,如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?

def get_lines():
	with open('file.txt','rb') as f: 
		for i in f:
			yield i

个人认为:还是设置下每次返回的行数较好,否则读取次数太多。

def get_lines(): 
	l = []
	with open('file.txt','rb') as f: 
		data = f.readlines(60000)
	l.append(data) 
	yield l
from mmap import mmap
def get_lines(fp):
	with open(fp,"r+") as f:
	m = mmap(f.fileno(), 0) 
	tmp = 0
	for i, char in enumerate(m): 
		if char==b"\n":
			yield m[tmp:i+1].decode() 
			tmp = i+1
if name ==" main ":
	for i in get_lines("fp_some_huge_file"): 
		print(i)



  • 关注微信公众号【爱上开源】,该公众号会为你提供作者在网上找到有趣的开源项目,会将使用过程写成文章呈现给读者.公众号还提供爬虫和部分计算机资源给读者.如果读者想要什么资源可以私信给我,作者会尽力查询(不要涉嫌违法资源即可)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1309525802/article/details/108400476

智能推荐

opencv生成圆形标定版程序_圆环标定板图片生成-程序员宅基地

文章浏览阅读1.4k次。#include &lt;opencv2/highgui/highgui.hpp&gt;#include &lt;opencv2/imgproc/imgproc.hpp&gt;#include &lt;opencv2/opencv.hpp&gt; using namespace cv;using namespace std; #define WINDOW_..._圆环标定板图片生成

iOS设置标题栏文字颜色,以及设置导航栏背景颜色、文字颜色_iso mac 标题栏色系-程序员宅基地

文章浏览阅读4.3k次。首先,将项目info选项中的最后一项下拉选中最后一项,然后,在appdelegate中设置- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ [UIApplication sharedApplication_iso mac 标题栏色系

给每个星座的1封信~不知道从哪里转来的-程序员宅基地

文章浏览阅读181次。【给白羊座的1封信】 白羊的人生可以用两个字概括:纠结。不管从哪一方面来说 白羊本身就是一个矛盾的个体。与白羊相恋须知:1.很慢热 我很冷漠 2.很直接 讨厌转弯 3.不喜欢说话 也不喜欢你太吵 4.喜欢自由的感觉 讨厌啰嗦 5.心智很成熟 看事很透彻 6.很绝 7.需要行动证明你爱我。 羊羊人看上去不拘小节 其实感情上道德上有绝对洁癖 触动原则的任何错误哪怕再小都没...

论出入口控制系统中的不同识别技术-程序员宅基地

文章浏览阅读1k次。出入口控制系统 access control system(ACS) 是采用现代电子技术与软件信息技术,在出入口通过对目标的正确识别,确定对目标进行放行或拒绝,同时进行记录和报警等操作的控制系统,系统同时对出入目标的编号、出入时间、出入口编号等情况进行登录与存储,从而保证被控区域及目标的安全,实现智能管理。出入口控制系统广泛应用于智能建筑的安全防范、车..._access control system

【ARM系列】Armv8/Armv9结构入门指南_armv8架构入门指南-程序员宅基地

文章浏览阅读543次。本文记录armv8架构入门指南,方便查阅_armv8架构入门指南

C++ 实现画简单3D大爱心(免费附源码)_c++爱心免费-程序员宅基地

文章浏览阅读1w次,点赞24次,收藏115次。把你的心我的心串一串,画一个同心圆话不多说直接上源码吧#include <iostream>#include <cmath>using namespace std;float f(float x, float y, float z){ float a = x * x + 9.0f / 4.0f * y * y + z * z - 1; ..._c++爱心免费

随便推点

基于stm32人脸识别打卡体温物联网嵌入式软硬件开发单片机毕业源码案例设计-程序员宅基地

文章浏览阅读223次,点赞6次,收藏4次。(1)硬件端1. STM32F103C8T6:用于所有程序的中控和模块数据通信;2. 0.96寸OLED:用于显示的当前环境数据以及识别的ID和人体体温;3. 体温传感器(LU90614):使用红外体温传感器进行监测人的实时体温4. 人脸识别模块(TX510):使用HEX指令控制识别模块进行人脸识别和人脸录入等功能;5. MQ-135:监测入口的空气质量,用于数据记录6. 蜂鸣器:用于检测到异常数据时开启报警(2)APP端1. 可以查看人员的打卡情况以及打开时体温(需要APP在线

【代码阅读软件】VSCode最新版本 下载、安装、配置_vscode安装包-程序员宅基地

文章浏览阅读2.8k次,点赞14次,收藏16次。介绍VSCode的下载、安装、配置,适合零基础同学_vscode安装包

条码打印软件如何批量制作学生考试条形码标签_考试条形码如何操作-程序员宅基地

文章浏览阅读8.2k次,点赞2次,收藏5次。提起条码打印软件,人们可能首先想到的是产品标签,商品包装上的条码等。其实中琅领跑条码打印软件还有更多的应用范围,比如工作证、学生证、图书管理标签、学生考试条码标签等等。本文我们要制作的就是批量生成学生考试条形码标签,主要用于在考试时,贴课桌上含有班级、学生姓名、准考证号以及座位号的考试条形码标签。首先,看一下含有考生信息的excel表格。然后我们将此考生信息作为数据库导入中琅领跑条码打印软件中..._考试条形码如何操作

kafka的 groupid 与 auto.offset.reset_properties.auto.offset.reset-程序员宅基地

文章浏览阅读391次。kafka-0.10.1.X版本之前: auto.offset.reset 的值为 smallest 和 largest.(offest保存在zk中)kafka-0.10.1.X版本之后: auto.offset.reset 的值更改为:earliest, latest(默认) 和 none (offest保存在kafka的一个特殊的topic名为:__consumer_offsets里面)_properties.auto.offset.reset

video标签常用的api你都知道哪些?_video api-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏3次。在触发事件时,会将一个事件对象作为参数传递给事件处理函数,该事件对象包含了关于右键点击的信息,如鼠标位置等。最近接到一个需求,需要把视频的下载功能在页面上关闭下载功能和右键下载功能。: 返回一个TimeRanges对象,用来表示视频可以被快进的时间范围。: 返回一个TimeRanges对象,用来表示视频已经加载的缓冲范围。: 返回一个TimeRanges对象,用来表示视频已经播放的时间范围。: 返回一个布尔值,表示当前视频是否暂停播放。: 获取或设置当前视频播放的时间。: 获取当前视频播放的URL地址。_video api

重磅!100位校高校教师晒工资,详细晒,全国各地!要进高校的博士们参考-程序员宅基地

文章浏览阅读6.3k次。点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看”转载于:来源 | 小木虫论坛,察言观数公众号编辑|各省高校引才@everwanna211高校行政岗,中部省份,正式编制,工作两年,某权利部门科员。工资:每个月到手工资大约4000左右,年终绩效工资2.5万。房子:住房公积金每月500多。加班工资:..._高校教师工资

推荐文章

热门文章

相关标签