标点符(钱魏 Way)

Python读写文件学习笔记

文件与文件路径

  • 如果想打印Windows中的中文文件名或路径,使用 decode(“GBK”)
  • Windows中的反斜杠与Linux中的正斜杠 使用sep(反斜杠需要使用\\转义)
  • 合并路径使用path.join()
  • 获取当前目录可以是用getcwd,类似Linux中pwd命令
  • 相对路径(.)点表示当前文件夹(..)点点表示父文件件
  • 创建文件夹使用makedirs(),其会创建中间文件夹,类似Linux命令 mkdir –p
  • 相对路径、绝对路径转换
    • path.abspath(path):返回绝对路径
    • path.isabs(path):判断是否是绝对路径
    • path.relpath(path,start):返回相对路径
  • 路径分割:
    • path.dirname(path):返回文件所在目录,os.path.basename(path):返回文件名
    • path.split(path) == (os.path.dirname(path), os.path.basename(path)),.silit(os.sep)是将路径按分隔符分割
  • 查看看文件大小:path.getsize(),只能统计文件,不同统计文件夹,如需统计文件夹需要自行遍历。
  • 检查路径有效性
    • path.exists:路径是否存在
    • path.isdir:是否为目录
    • path.isfile:是否是文件

Python遍历文件夹的两种方法:

1、使用walk()

2、使用listdir:

第一种方法,输出总是先文件夹后文件名的,对于第二种,则是按照目录树结构以及按照首字母排序进行输出的。

读写文件内容

使用with语句打开文件

在Python中读写文件需要3个步骤:

  • 调用open函数,返回一个File对象
  • 调用File对象的read()或write()方法
  • 调用File对象的close() 方法,关闭该文件

文件常用打开模式:

  • ‘r’:只读(缺省。如果文件不存在,则抛出错误)
  • ‘w’:只写(如果文件不存在,则自动创建文件)
  • ‘a’:附加到文件末尾
  • ‘r+’:读写

如果需要以二进制方式打开文件,需要在mode后面加上字符”b”,比如”rb””wb”等

如果不用with语句,代码如下:

这里有两个问题:

  • 可能忘记关闭文件句柄;
  • 文件读取数据发生异常,没有进行任何处理。

加强版代码:

虽然这段代码运行良好,但是太冗长了。with除了有更优雅的语法,还可以很好的处理上下文环境产生的异常。

with版本的代码:

with的工作流程:

  • 紧跟with后面的语句被求值后,返回对象的 __enter__() 方法被调用,这个方法的返回值将被赋值给as后面的变量。
  • 当with后面的代码块全部被执行完之后,将调用前面返回对象的 __exit__()方法。

文本读取:read()、readline()、readlines()

read()是最简单的一种方法,一次性读取文件的所有内容放在一个大字符串中,即存在内存中

read()

read()的优点:

  • 方便、简单
  • 一次性独读出文件放在一个大字符串中,速度最快

read()的缺点:

  • 文件过大的时候,占用内存会过大

readline()

readline()是逐行读取文本,结果是一个list

readline()的优点:

  • 占用内存小,逐行读取

readline()的缺点:

  • 由于是逐行读取,速度比较慢

readlines()

readlines()一次性读取文本的所有内容,结果是一个list

这种方法读取的文本内容,每行文本末尾都会带一个’\n’换行符 (可以使用L.rstrip(‘\n’)去掉换行符)

readlines()的优点:

  • 一次性读取文本内容,速度比较快

readlines()的缺点:

  • 随着文本的增大,占用内存会越来越多

文本写入:write()与writelines()

  • write()传入的是字符串
  • writelines()传入的数一个数组

JSON的读取与写入

json原则上也是文本数据,与纯文本的读取和写入的方式类似,这里核心较少的是对于json数据的序列化和反序列化。

将Python数据结构转化为字符串:

将字符串转换为Python数据结构:

当处理的是文件时:

另外可以使用simplejson替换Python自带的json模块,两者功能相同,只是simplejson有更高的性能。

  • dump(obj, fp, **kwargs):将python对象写到文件中(以JSON格式)
  • dumps(obj, **kwargs):将python对象表示成字符串(JSON的格式)
  • load(fp, **kwargs):从文件中(包含JSON结构)读取为python对象
  • loads(s, **kwargs):从字符串中(包含JSON结构)读取为python对象

JSON数据的另外存储方案

Pickle与cPickle

Pickle与cPickle的功能一样,唯一的区别是后者是用C实现的,效率会更高一些。Pickle和JSON的函数相同,这里介绍下dump与load。

dump的第一个参数为需要存储的对象,第二个参数为文件句柄,第三个参数protocol指的是协议。

  • Protocol version 0 原始的纯文本存储
  • Protocol version 1 旧版二进制存储
  • Protocol version 2 新版二进制存储(效率更高)(Python 2.3新增)
  • Protocol version -1 使用最高版本

文件是否按照二进制方式打开好像影响不大,不过为了保险还是按它说的来比较好。可以看出上面的程序在文件里存储了2个对象,load的时候可以执行2次,x1得到的是之前obj1的对象,x2得到的是之前obj2的对象。不要写成这样:

这样得到的x1,x2都是obj的对象。存储了几个对象就只能load几次,如果load超过了存储的对象,会抛出EOFError异常。这里能够存储的对象可以是任意对象,字典、列表、元组、numpy数组、SocketServer..

与JSON的区别

  • JSON只能存储文本形式的存储,Pickle可以存储成二进制
  • JSON是人可读的,Pickle不可读。
  • JSON广泛应用于除Python外的其他领域,Pickle是Python独有的。
  • JSON只能dump一些python的内置对象,Pickle可以存储几乎所有对象。

如果偏向应用特别是web应用方面,可以常用JSON格式。如果偏向算法方面,尤其是机器学习,则应该使用cPickle。

参考文档:https://docs.python.org/2/library/pickle.html

shelve

shelve是一个简单的数据存储方案,类似key-value数据库,可以很方便的保存python对象,其内部是通过pickle协议来实现数据序列化。shelve只有一个open()函数,这个函数用于打开指定的文件(一个持久的字典),然后返回一个shelf对象。shelf是一种持久的、类似字典的对象。其values值可以是任意基本Python对象–pickle模块可以处理的任何数据。这包括大多数类实例、递归数据类型和包含很多共享子对象的对象。keys还是普通的字符串。

  • flag 参数表示打开数据存储文件的格式:
    • ‘r’ 以只读模式打开一个已经存在的数据存储文件
    • ‘w’ 以读写模式打开一个已经存在的数据存储文件
    • ‘c’ 以读写模式打开一个数据存储文件,如果不存在则创建
    • ‘n’ 总是创建一个新的、空数据存储文件,并以读写模式打开
  • protocol 参数表示序列化数据所使用的协议版本,默认是pickle v3;
  • writeback 参数表示是否开启回写功能。

参考文档:https://docs.python.org/2/library/shelve.html

pprint.pformat()

如果想要将变量输出到文本且,格式漂亮。那么可以导入pprint模块来用。

  • pprint()函数将列表或字典中的内容“漂亮打印”到屏幕。
  • pformat()函数将返回同样格式的文本字符串,但是不打印它。

可以将pprint.pformat()返回的字符串,写入.py文件。该文件就可以成为你自己的模块,如果你要使用存储在其中的变量,就可以导入他。

XML的读取

请查看:Python解析XML的几种方法 https://www.biaodianfu.com/python-xml.html

Excel数据的读取与写入

请查看:Python读写Excel的几种方法 https://www.biaodianfu.com/python-excel.html

数据库数据的读取与写入

请查看:Python读写数据库的方法 https://www.biaodianfu.com/python-db-api.html

码字很辛苦,转载请注明来自标点符《Python读写文件学习笔记》

评论