加入收藏 | 设为首页 |

企查查-一文看懂Python IO操作:文件读取、写入都讲理解了

海外新闻 时间: 浏览:325 次

导读:IO在计算机中指的是Input/Output,也便是输入输出。但凡用到数据交换的当地,都会触及IO编程,例如磁盘、网络的数据传输。

在IO编程中,Stream(流)是一种重要的概念,分为输入流(Input Stream)和输出流(Output Stream)。咱们能够把流理解为一个水管,数据相当于水管中的水,可是只能单向活动,所以数据传输进程中需求架起两个水管,一个担任输入,一个担任输出,这样读写就能够完成同步。

本文首要解说磁盘IO操作。

作者:范传辉

如需转载请联络篇章科技

01 文件读写

1. 翻开文件

读写文件是最常见的IO操作。Python内置了读写文件的函数,方便了文件的IO操作。

文件读写之前需求翻开文件,确认文件的读写形式。open函数用来翻开文件,语法如下:

open(name[.mode[.buffering]])

open函数运用一个文件名作为仅有的强制参数,然后回来一个文件方针。形式(mode)和缓冲区(buffering)参数都是可选的,默许形式是读形式,默许缓冲区是无。

假设有个名为qiye.txt的文本文件,其存储途径是c:\text(或许是在Linux下的~/text),那么能够像下面这样翻开文件。在交互式环境的提示符“>>>”下,输入如下内容:

>>> f = open(r'c:\text\qiye.txt')

假设文件不存在,将会看到一个相似下面的反常回溯:

Traceback (most recent call last):
File "", line 1, in
IOError: [Errno 2] No such file or directory: 'C:\\qiye.txt'

2. 文件形式

下面首要说一下open函数中的mode参数,经过改动mode参数能够完成对文件的不同操作。

  • 'r':读形式
  • 'w':写形式
  • 'a':追加形式
  • 'b':二进制形式(可添加到其他形式中运用)
  • '+':读/写形式(可添加到其他形式中运用)

这儿首要是提示一下'b'参数的运用,一般处理文本文件时,是用不到'b'参数的,但处理一些其他类型的文件(二进制文件),比方mp3音乐或许图画,那么应该在形式参数中添加'b',这在爬虫中处理媒体文件很常用。参数'rb'能够用来读取一个二进制文件。

3. 文件缓冲区

open函数中第三个可选参数buffering操控着文件的缓冲。

假设参数是0,I/O操作便是无缓冲的,直接将数据写到硬盘上;假设参数是1,I/O操作便是有缓冲的,数据先写到内存里,只要运用flush函数或许close函数才会将数据更新到硬盘;假设参数为大于1的数字则代表缓冲区的巨细(单位是字节),-1(或许是任何负数)代表运用默许缓冲区的巨细。

4. 文件读取

文件读取首要是分为按字节读取和按行进行读取,常常用到的办法有read()、readlines()、close()。

在“>>>”输入f = open(r'c:\text\qiye.txt')后,假设成功翻开文本文件,接下来调用read()办法则能够一次性将文件内容悉数读到内存中,最终回来的是str类型的方针:

>>> f.read()
"qiye"

最终一步调用close(),能够封闭对文件的引证。文件运用完毕后有必要封闭,因为文件方针会占用操作体系资源,影响体系的IO操作。

>>> f.close()

因为文件操作可能会呈现IO反常,一旦呈现IO反常,后边的close()办法就不会调用。所以为了确保程序的健壮性,咱们需求运用try ... finally来完成。

try:
f = open(r'c:\text\qiye.txt','r')
print f.read()
finally:
if f:
f.close()

上面的代码略长,Python供给了一种简略的写法,运用with句子来代替try ... finally代码块和close()办法,如下所示:

with open(r'c:\text\qiye.txt','r') as fileReader:
print fileReader.read()

调用read()一次将文件内容读到内存,可是假设文件过大,将会呈现内存不足的问题。一般关于大文件,能够重复调用read(size)办法,一次最多读取size个字节。假设文件是文本文件,Python供给了愈加合理的做法,调用readline()能够每次读取一行内容,调用readlines()一次读取一切内容并按行回来列表。

咱们能够依据自己的详细需求采纳不同的读取办法,例如小文件能够直接采纳read()办法读到内存,大文件愈加安全的办法是接连调用read(size),而关于配置企查查-一文看懂Python IO操作:文件读取、写入都讲理解了文件等文本文件,运用readline()办法愈加合理。

将上面的代码进行修正,选用readline()的办法完成如下所示:

with open(r'c:\text\qiye.txt','r') as fileReader:
for line in fileReader.readlines():
print line.strip()

5. 文件写入

写文件和读文件是相同的,仅有的区别是在调用open办法时,传入标识符'w'或许'wb'表明写入文本文件或许写入二进制文件,示例如下:

f = open(r'c:\text\qiye.txt','w')
f.write('qiye')
f.close()

咱们能够重复调用write()办法写入文件,最终有必要运用close()办法来封闭文件。运用write()办法的时分,操作体系不是立行将数据写入文件中的,而是先写入内存中缓存起来,比及闲暇时分再写入文件中,最终运用close()办法就将数据完整地写入文件中了。

当然也能够运用f.flush()办法,不断将数据当即写入文件中,最终运用close()办法来封闭文件。和读文件相同道理,文件操作中可能会呈现IO反常,所以仍是引荐运用with句子:

with open(r'c:\text\qiye.txt','w') as fileWriter:
fileWriter.write('qiye')

02 操作文件和目录

在Python中对文件和目录的操作常常用到os模块和shutil模块。接下来首要介绍一些操作文件和目录的常用办法:

  • 取得当时Python脚本作业的目录途径:
  • os.getcwd()。
  • 回来指定目录下的一切文件和目录名:
  • os.listdir()。例如回来C盘下的文件:os.listdir("C:\\")
  • 删去一个文件:
  • os.remove(filepath)。
  • 删去多个空目录:
  • os.removedirs(r"d:\python")。
  • 查验给出的途径是否是一个文件:
  • os.path.isfile(filepath)。
  • 查验给出的途径是否是一个目录:
  • os.path.isdir(filepath)。
  • 判别是否是绝对途径:
  • os.path.isabs()。
  • 查验途径是否真的存在:
  • os.path.exists()。例如检测D盘下是否有Python文件夹:os.path.exists(r"d:\python")
  • 别离一个途径的目录名和文件名:
  • os.path.split()。例如:os.path.split(r"/home/qiye/qiye.txt"),回来结果是一个元组:('/home/qiye', 'qiye.txt')。
  • 别离扩展名:
  • os.path.splitext()。例如os.path.splitext(r"/home/qiye/qiye.txt"),回来结果是一个元组:('/home/qiye/qiye', '.txt')。
  • 获取途径名:
  • os.path.dirname(filetpah)。
  • 获取文件名:
  • os.path.basename(filepath)。
  • 读取和设置环境变量:
  • os.getenv()与os.putenv()。
  • 给出当时渠道运用的行终止符:
  • os.linesep。Windows运用'\r\n',Linux运用'\n'而Mac运用'\r'。
  • 指示你正在运用的渠道:
  • os.name。关于Windows,它是'nt',企查查-一文看懂Python IO操作:文件读取、写入都讲理解了而关于Linux/Unix用户,它是'posix'。
  • 重命名文件或许目录:
  • os.rename(old,new)。
  • 创立多级目录:
  • os.makedirs(r"c:\python\test")。
  • 创立单个目录:
  • os.mkdir("test")。
  • 获取文件特点:
  • os.stat(file)。
  • 修正文件权限与时刻戳:
  • os.chmod(file)。
  • 获取文件巨细:
  • os.path.getsize(filename)。
  • 仿制文件夹:
  • shutil.copytree("olddir","newdir")。olddir和newdir都只能是目录,且newdir有必要不存在。
  • 仿制文件:
  • shutil.copyfile("oldfile","newfile"),oldfile和newfile都只能是文件;shutil. copy("oldfile","newfile"),oldfile只能是文件,newfile能够是文件,也能够是方针目录。
  • 移动文件(目录):
  • shutil.move("oldpos","newpos")。
  • 删去目录:
  • os.rmdir("dir"),只能删去空目录;shutil.rmtree("dir"),空目录、有内容的目录都能够删。

03 序列化操作

方针的序列化在许多高档编程言语中都有相应的完成,Python也不破例。程序运转时,一切的变量都是在内存中的,例如在程序中声明一个dict方针,里边存储着爬取的页面的链接、页面的标题、页面的摘要等信息:

d = dict(url='index.html',title='主页',content='主页')

在程序运转的进程中爬取的页面的链接会不断改变,比方把url改成了second.html,可是程序一完毕或意外中止,程序中的内存变量都会被操作体系进行收回。

假设没有把修正过的url存储起来,下次运转程序的时分,url被初始化为index.html,又是从主页开端,这是咱们不愿意看到的。所以把内存中的变量变成可存储或可传输的进程,便是序列化。

将内存中的变量序列化之后,能够把序列化后的内容写入磁盘,或许经过网络传输到其他机器上,完成程序状况的保存和同享。反过来,把变量内容从序列化的方针从头读取到内存,称为反序列化。

在Python中供给了两个模块:cPickle和pickle来完成序列化,前者是由C言语编写的,功率比后者高许多,可是两个模块的功用是相同的。一般编写程序的时分,采纳的计划是先导入cPickle模块,假设此模块不存在,再导入pickle模块。示例如下:

try:
import cPickle as pickle
except ImportError:
import pickle企查查-一文看懂Python IO操作:文件读取、写入都讲理解了

pickle完成序列化首要运用的是dumps办法或dump办法。dumps办法能够将恣意方针序列化成一个str,然后能够将这个str写入文件进行保存。在Python Shell中示例如下:

>>> import cPickle as pickle
>>> d = dict(url='index.html企查查-一文看懂Python IO操作:文件读取、写入都讲理解了',title='主页',content='主页')
>>> pickle.dumps(d)
"(dp1\nS'content'\np2\nS'\\\xca\\\xd7\\\xd2\\\xb3'\np3色皇宫\nsS'url'\np4\nS'index.html'\np5\nsS'title'\np6\ng3\ns."

假设运用dump办法,能够将序列化后的方针直接写入文件中:

>>> f=open(r'D:\dump.txt','wb')
>>> pickle.dump(d,f)
>>> f.close()

pickle完成反序列化运用的是loads办法或load办法。把序列化后的文件从磁盘上读取为一个str,然后运用loads办法将这个str反序列化为方针,或许直接运用load办法将文件直接反序列化为方针,如下所示:

>>> f=open(r'D:\dump.txt','rb')
>>> d=pickle.load(f)
>>> f.close()
>>> d
{'content': '\\xca\\xd7\\xd2\\xb3', 'url': 'index.html', 'title': '\\xca\\xd7\\xd2\\xb3'}

经过反序列化,存储为文件的dict方针,又从头康复出来,可是这个变量和原变量没有什么关系,仅仅内容相同。以上便是序列化操作的整个进程。

假设咱们想在不同的编程言语之间传递方针,把方针序列化为规范格局是要害,例如XML,可是现在愈加盛行的是序列化为JSON格局,既能够被一切的编程言语读取解析,也能够方便地存储到磁盘或许经过网络传输。

关于作者:范传辉,资深网虫,Python开发者,参加开发了多项网络使用,在实践开发中积累了丰厚的实战经验,并长于总结,贡献了多篇技能文章广受好评。研讨爱好是网络安全、爬虫技能、数据剖析、驱动开发等技能。

本文摘编自《Python爬虫开发与项目实战》,经出书方授权发布。

延伸阅览《Python爬虫开发与项目实战》

引荐语:零根底学习爬虫技能,从Python和Web前端根底开端讲起,由浅入深,包括很多事例,实用性强。