python文件操作知多少?

author author     2022-12-08     429

关键词:

前言

对于文件大家应该都不陌生,但是在接触计算机之前,通常将文件定义为内容的载体.如公文书信或者有关政策理论方面的文章.计算机文件也一样,而且在计算机中文件的类型更加丰富多样,用途广泛.有的是用来支撑程序运行的,有的只是单纯用于数据存储,文件使用文件扩展名区分文件类型,比如我们常用图片格式,有.jpg/.png/.gif,记事本保存的文字.txt,办公文档类型.docx/.pptx/.xlsx等.它是存储在计算机存储区的信息集合.

文件是计算机中具有特定标识的存储区,他由操作系统管理,用于计算机操作系统的使用过程中的各项操作的支持,在计算机的系统使用中,文件的操作是贯穿始终的,小到文本存储,大到各种系统软件.而且在软件的开发中对文件的操作几乎是必不可少的,不管是web程序还是桌面程序,就比如对数据的操作,其实也是通过特定的算法和特定的数据格式把数据存入持久化文件中.还有在Python的最热门的自动化办公和数据分析中,对文件的读写操作也是常用操作,还有我们网站中最常用图片上传操作同样涉及到文件操作.

我们开发中对文件的操作非常频繁.而且很多我们待处理的信息都存储于文件中,当处理这些信息时需要通过Python程序来处理,我们该如何操作呢?下面带你领略Python处理文件的风采.

在学习之前,我们先来看看文件处理的基本步骤:

python文件操作知多少?_python

文件的读取

Python程序想要使用计算机存储区的文件时,需要遵守Python文件操作的规定,依顺序读取,如果可以随便处理会让文件变得很不安全.

想要读取文件,先使用Python内置的open()函数通过提供文件路径的方式将文件和程序链接起来,之后便可以通过操作文件对象的方式处理文件.在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法.

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode).

函数基本使用:open(file, mode=r)

完整语法:

open(file, mode=r, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

参数说明:

  1. file: 必需,文件路径(相对或者绝对路径)
  2. mode: 可选,文件打开模式(常用值:t,x,b,+,r,rb,rb+,w,w+,wb....)默认为文本模式,如果要以二进制模式打开,加上b 
  3. buffering: 设置缓冲
  4. encoding: 一般使用utf8
  5. errors: 报错级别
  6. newline: 区分换行符
  7. closefd: 传入的file参数类型
  8. opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符

既然有fo.open()那当然有fo.close(),close() 方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发 ValueError

当 file 对象,被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象。要养成使用 close() 方法关闭文件是的好习惯

下面通过简单的例子示范文件的操作:

首先先创建一个txt文本文件.随便输入点内容.

python文件操作知多少?_python_02

# encoding=utf-8防止读取中文出现错误,指定字符集为utf8
file = open(rtest.txt,encoding=utf-8) #r是防止字符转义的 这里可以使用相对路径或者绝对路径

while True: #Python一般在冒号后面需要注意缩进
line = file.readline() #按行读取
if len(line) == 0: #读完跳出循环停止读取
break

print(line,end="")

file.close()

执行结果:

python文件操作知多少?_文件读写_03

在上面的第5行代码中,我们使用到lreadline() 函数,是按行读取文本,文件读取还有一个与之类似的按字符读取read(N),N为一次从文件读取的字符个数,默认读取一个字符到字符串

上面我们使用了while的死循环,通过判断读取的进度结束读取并跳出循环(注:在程序中一定要避免死循环) ,我们还可以使用for循环同样能达到一样的效果:for line in open("文件路径"),按行读取,其实就是通过循环移动文件读取的指针.

再举个例子:计算文件中某个字符的出现次数统计,在平常开发中好像也常用

这里会使用到collections库

collections是Python内建的一个集合模块,提供了许多有用的集合类,实现一些特定的数据类型,可以替代Python中常用的内置数据类型如dict,list,set和tuple。比如不可变类型tuple,我们可以轻松地用它来表示一个二元向量,但这不是本文的重点,感兴趣的童鞋可以自行搜索学习.

素材:我复制的是这篇文章到test.txt

python文件操作知多少?_文件操作_04

import collections
file = open(test2.txt,encoding=utf-8)
str = file.read().split( )
n = collections.Counter(str)
print(n[home])
s = zip(n.values(), n.keys())
output = open(result.txt,w,encoding=utf-8)
for item in sorted(s, reverse=True):
output.write("0 1\\n".format(item[1], item[0]))

result.txt统计的部分截图:

python文件操作知多少?_文件操作_05

直接读入数据然后使用collections.Counter()来统计每个单词的出现次数,返回的是一个字典,然后使用zip把字典压缩成列表变量s

文件的写入

前面说了文件的读操作,自然还有对应的写操作.写文件操作的顺序和读操作的顺序差不多:建立文件链接,写数据,然后关闭文件.

接着我们通过例子来感受一下.

#写数据操作
text = As he stood in front of the group of overachievers he said, OK, time for a quiz.
He pulled out a one-gallon,wide-mouth jar and set it on the table in front of him.
He also produced about a dozen fist-sized rocks and carefully placed them,one at a time, into the jar.
When the jar was filled to the top and no more rocks would fit inside, he asked, Is this jar full?
...


file = open("testWrite.txt", "w")
file.write(text)
file.close()

testWrite.txt截图

python文件操作知多少?_数据_06

使用了三引号给text指定了带有换行的字符串

上面的写入操作主要是write()函数,写入函数除了这个还有writelines()函数用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表。

我们还可以从web上读取数据并保存所需要的数据到文件

#读取web页面信息
from urllib import request
from bs4 import BeautifulSoup

url="http://www.jianshu.com"
headers = User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
page = request.Request(url,headers=headers)
page_info = request.urlopen(page).read().decode(utf-8)

soup = BeautifulSoup(page_info, html.parser)

titles = soup.find_all(a, title)

file = open("webinfo.txt","w",encoding=utf-8)
for title in titles:
file.write(title.string + \\n)
file.write("http://www.jianshu.com" + title.get(href) + \\n\\n)

结果截图:

python文件操作知多少?_数据_07

这个程序requests和BeautifulSoup两个库来获取网络上的信息

如果提示两个不存在,可使用以下命令安装即可:

pip install requests
pip install beautifulsoup4

文件的其他操作函数

file.flush():刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入

file.fileno():返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上

file.next():返回文件下一行,但是Python3不支持

与next()函数类似的还有seek()

file.seek():移动文件读取指针到指定位置

file.tell():返回文件当前位置

file.truncate([size]):从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小


扩展

上面例子只是对少量数据的处理,但是在日常的开发中往往需要大数据文件进行处理.相对来说Python对大数据文件处理效率不高.所以如果我们遇到大数据文件应该怎么处理呢.我们一般处理方式有:

可以使用分治的思想

  1. 将文件切分为多个小段,同时处理多段,处理完后将处理结果合并
  2. 使用Python自带的迭代器分行处理文件

这个问题稍微复杂,这里点到为止,以后有机会再单独细说.

对文件的操作就到这里了.篇幅有限,点到为止.还有更多操作文件的方式等你发现!

mysql系列-redolog知多少

...理存储空间的,我们的增删改查本质上都是对页面上进行操作。我们知道在访问磁盘的时候,MySQL是会把数据加载到BufferPool然后进行操作的。对于DML操作,表、索引等的增删改DDL操作,还有数据本身是在BufferPool缓冲池中可能还... 查看详情

python异常知多少

我们在编写程序的时候或多或少都出现过异常,也许是不小心,也可能是逻辑错误亦或是程序以外的问题,比如环境的问题,不管是什么原因,异常是我们不希望看到的.接下来,我们就什么是异常,遇到异常如何解决展开唠唠1.什么是异... 查看详情

adb命令知多少?详细adb命令大全来啦

...用,是一个客户端-服务器端程序。其中客户端是用来操作的电脑,服务端是Android设备。ADB也是AndroidSDK中的一个工具,可以直接操作管理Android模拟器或者真实的Android设备。2、为什么要用ADB?ADB可以直接操作管理手机... 查看详情

大前端快闪:package.json文件知多少?(代码片段)

...助读者构建完整的全栈技能体系。快闪一:package.json文件知多少如果你使用了nodejs、npm项目、Angular项目等&#x 查看详情

python从入门到精通python的编码规范,标识符知多少?(代码片段)

...三连哦。这是Pyhon系列文章的第三篇,本文主要介绍Python程序的编码规范。干货满满,建议收藏,需要用到时常看看。小伙伴们如有问题及需要,欢迎踊跃留言哦~~~。文章目录前言注释缩进规则编码规范标识符命... 查看详情

devecostudio3.1beta新特性知多少

...发者在工程视图选中待检查的目录或选中正在编辑的代码文件,右键执行CodeLinter菜单,检查完毕后,底部的检查结果窗口中将列举所有代码检查告警,用户可根据告警提示及指导修复代码缺陷。 代码检查 并且,开 查看详情

eshoponcontainers知多少[4]:catalogmicroservice(代码片段)

...构,来执行产品信息的创建、读取、更新和删除(CRUD)操作。这种类型的服务在单个ASP.NETCoreWebAPI项目中即可实现所有功能,该项目包括数据模型类、业务逻辑类及其数据访问类 查看详情

nginx知多少系列之配置文件详解(代码片段)

原文:Nginx知多少系列之(三)配置文件详解目录1.前言2.安装3.配置文件详解 4.工作原理 5.Linux下托管.NETCore项目6.Linux下.NETCore项目负载均衡7.Linux下.NETCore项目Nginx+Keepalived高可用(主从模式)8.Linux下.NETCore项目Nginx+Keepalived高可... 查看详情

文件上传知多少,php面试学到老,虽然够用也挺好,知识体系也重要(代码片段)

...捐终入海💋目录前言经典面试题1.PHP如何获取上传的文件?2.哪些配置影响文件上传的大小数量?3.PHP除了POST还可以怎么接收上传文件?4.PHP上传文件的关键方法?文件上传处理完整解析文件上传的流程`php.i... 查看详情

文件上传知多少,php面试学到老,虽然够用也挺好,知识体系也重要(代码片段)

...捐终入海💋目录前言经典面试题1.PHP如何获取上传的文件?2.哪些配置影响文件上传的大小数量?3.PHP除了POST还可以怎么接收上传文件?4.PHP上传文件的关键方法?文件上传处理完整解析文件上传的流程`php.i... 查看详情

odex知多少(代码片段)

...安装一个app到android设备上时,首先会对应用对应中dex文件进行优化,优化产物就会存在/data/dalvik-cache/中,这样每次加载应用时就没必要每次都进行优化。此外,从逆向角度来看odex化的apk,也增加了逆向的难... 查看详情

事件总线知多少

ImplementinganeventbuswithRabbitMQforthedevelopmentortestenvironmentAbpEventBus  查看详情

事件总线知多少

ImplementinganeventbuswithRabbitMQforthedevelopmentortestenvironmentAbpEventBus  查看详情

编码命名方式知多少(代码片段)

...结参考文献编码时,命名无处不在。比如我们需要对文件命令,对目录命名,对变量命名,还有其他类型的资源等等。那么取名时,业界 查看详情

性能测试知多少---性能分析与调优的原理

...优如何下手,先从硬件开始,还是先从代码或数据库。从操作系统(CPU调度,内存管理,进程调度,磁盘I/O)、网络、协议(HTTP, TCP/IP ),还是从应用程序代码,数据库调优,中间件配置等方面入手。  单一个中间... 查看详情

网页制作知多少

网页制作知多少一、通用模板:<!DOCTYPEhtml><htmllang=”en”>  <head>      <meta charset=”UTF-8”/>    &nb 查看详情

androidcameraapi1.0,2.0,3.0知多少

...技术A  看到源码里面有诸如Camera.h,Camera2.h,Camera3.h的文件,觉得奇怪,后面在Camera3.h  中找到了对前后3个版本的概要性描述。  BTW,我们看代码的过程中,如何避免不需要的文件被添加到工程?  我是指:我只想看Came... 查看详情

excel公式知多少?

...5点半傍下班来了个急活,领导从三方系统下载的对账单文件,要我导入到一个系统的数据库里。写程序不赶趟。凭着对excel操作有一些基础,那么,通过excel直接生成所需的insert语句,然后发给运维执行,也许更快! 原始数... 查看详情