文件读写与存储

7.2. 读写文件

open()返回一个文件对象,最常见的用法带有两个参数:open(filename, mode)。

>>> f = open('workfile', 'w')

第一个参数是一个包含文件名的字符串。第二个参数是另一个包含几个字符的字符串,用于描述文件的使用方式。mode为'r'时表示只是读取文件;w表示只是写入文件(已经存在的同名文件将被删掉);'a'表示打开文件进行追加;写入到文件中的任何数据将自动添加到末尾'r+'表示打开文件进行读取和写入。mode参数是可选的;如果省略,则默认为'r'

通常,文件以文本模式打开,它表示你从文件读取以及向文件写入的字符串是经过特定的编码的。如果没有指定编码,则默认为与平台有关(参见open())。在mode后面附加'b'将以二进制模式打开文件:现在数据以字节对象的形式读取和写入。这个模式应该用于所有不包含文本的文件。

在文本模式中,读取的默认行为是将平台相关的换行(Unix上的\n、Windows上的\r\n)仅仅转换为\n。当在文本模式中写入时,默认的行为是将\n转换为平台相关的换行。这种对文件数据的修改对文本文件没有问题,但会损坏JPEG或EXE这样的二进制文件中的数据。在读取和写入这样的文件时要非常小心地使用二进制模式。

7.2.1. 文件对象的方法

本节中的示例将假设文件对象f已经创建。

要读取文件内容,可以调用f.read(size) ,该方法读取若干数量的数据并以字符串(在文本模式中)或字节对象(在二进制模式中)形式返回它。size是一个可选的数值参数。当 size被省略或者为负数时,将会读取并返回整个文件;如果文件大小是你机器内存的两倍时,这会产生问题。否则,最多读取并返回size字节。如果到了文件末尾,f.read() 会返回一个空字符串(" ")。

例如:

文件名f.txt

This is the entire file.
vnfdgntgkhngh.
ngirg tng Hahaahahahahaha
vfnggoh
In [87]: f = open('f.txt')

In [88]: f.read()
Out[88]: 'This is the entire file.\nvnfdgntgkhngh.\nngirg tng Hahaahahahahaha\nvfnggoh' In [89]: f.read()
Out[89]: '' In [90]: f.close()

f.readline()从文件读取一行数据;字符串结尾会带有一个换行符 (\n) ,只有当文件最后一行没有以换行符结尾时才会省略。这样返回值就不会有混淆;如果f.readline()返回一个空字符串,那就表示已经达到文件的末尾,而如果返回一个只包含一个换行符的字符串'\n',则表示遇到一个空行。

In [91]: f = open('f.txt')

In [92]: f.readline()
Out[92]: 'This is the entire file.\n' In [93]: f.readline()
Out[93]: 'vnfdgntgkhngh.\n' In [94]: f.readline()
Out[94]: 'ngirg tng Hahaahahahahaha\n' In [95]: f.readline()
Out[95]: 'vfnggoh' In [96]: f.readline()
Out[96]: '' In [97]: f.close()

对于从文件中读取行,可以在文件对象上循环。这是内存高效,快速,并导致简单的代码:

In [98]: f = open('f.txt')

In [99]: for line in f:
...: print(line, end='')
...:
This is the entire file.
vnfdgntgkhngh.
ngirg tng Hahaahahahahaha
vfnggoh

如果你想要读取的文件列表中的所有行的数据,你也可以使用 list(f) f.readlines()

f.write(string) 将 字符串 的内容写入到该文件,返回写入的字符数。

f.write(string) 将 字符串 的内容写入到该文件,返回写入的字符数。

In [105]: f = open('f.txt','a')

In [106]: f.write('This is test line.\n')
Out[106]: 19

其他类型的对象,在写入之前则需要转换成 字符串 (在文本模式下) 或 字节对象 (以二进制模式)


In [107]: value = ('the answer', 42) In [108]: s = str(value) # convert the tuple to string In [109]: f.write(s)
Out[109]: 18

f.tell()返回一个整数,代表文件对象在文件中的当前的位置,在二进制模式中该数值表示自文件开头到指针处的字节数,在文本模式中则是不准确的。

使用完一个文件后,调用f.close()可以关闭它并释放其占用的所有系统资源。调用f.close()后,再尝试使用该文件对象将自动失败。


In [110]: f.close() In [111]: f.read()
Traceback (most recent call last): File "<ipython-input-111-571e9fb02258>", line 1, in <module>
f.read() ValueError: I/O operation on closed file.

处理文件对象是使用with关键字是很好的做法。这具有的优点是,在其套件完成后,文件被正确关闭,即使在路上出现异常。它还比编写一个等同的try-finally语句要短很多:


In [114]: with open('f.txt','r') as f:
...: read_data = f.read()
...: print(read_data)
...:
This is the entire file.
vnfdgntgkhngh.
ngirg tng Hahaahahahahaha
vfnggohThis is test line.
('the answer', 42) In [115]: f.close()

补充实例:'r+'表示打开文件进行读取和写入

In [124]: f = open('f.txt','r+')

In [125]: f.write('chj 2018-4-5')
Out[125]: 12 In [126]: f.write('AAABBBCCC')
Out[26]: 9 In [127]: f.close()

看看f.txt内容:

chj 2018-4-5AAABBBCCCle.
vnfdgntgkhngh.
ngirg tng Hahaahahahahaha
vfnggohThis is test line.
('the answer', 42)

7.2.2. 使用json存储结构化数据

字符串可以轻松地写入和读取文件。数值就要多费点儿周折,因为read ()方法只会返回字符串,应将其传入int()这样的函数,就可以将'123'这样的字符串转换为对应的数值123。当您想要保存更复杂的数据类型(如嵌套列表和字典)时,手动解析和序列化变得复杂。

Python允许您使用名为JSON(JavaScript Object Notation)的流行数据交换格式,而不是让用户不断地编写和调试代码以将复杂的数据类型保存到文件中。标准模块json可以接受 Python 数据结构,并将它们转换为字符串表示形式;此过程称为序列化。从字符串表示重构数据称为反序列化。在序列化和反序列化之间,表示对象的字符串可能已经存储在文件或数据中,或者通过网络连接发送到一些远程机器。

注意JSON格式通常由现代应用程序使用以允许数据交换。许多程序员已经熟悉它,这使它成为互操作性的不错选择。


Python的文件读写与存储的更多相关文章

  1. 【转】Python之文件读写

    [转]Python之文件读写 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 ...

  2. 【Python】文件读写操作

    Python的文件读写有点类似php的文件读写.php的文件读写已经在<[php]让记事本成为你调控变量的控制台>(点击打开链接)说过了,以下用一个小样例说明Python的文件读写. 在F ...

  3. (转)Python之文件读写

    Python之文件读写 原文:https://www.cnblogs.com/huilixieqi/p/6494891.html 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 ...

  4. python 基础-文件读写'r' 和 'rb'区别

    原文链接: python基础-文件读写'r' 和 'rb'区别 一.Python文件读写的几种模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢? 1.文件使用方式标识 'r ...

  5. Python之文件读写

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

  6. python之文件读写详解

    打开文件 函数open() 参数说明: file:文件路径 mode: 文件的读写方式,默认'r',只读方式: buffering:设置缓冲策略,0用于二进制文件,1为行缓冲,用于文本模式:默认二进制 ...

  7. python中文件读写

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

  8. python的文件读写笔记

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

  9. python里文件读写操作

    文件读写操作一种基本操作,但是里面也存在很多需要注意的问题,例如字符编码.内存缓冲.指针位置等等.如果忽视这些问题就会引起很多不必要的麻烦.简单来说,文件的读写分为几个过程: 打开文件,并定义操作文件 ...

随机推荐

  1. asp.net 页面延时五秒,跳转到另外的页面

    asp.net 页面延时五秒,跳转到另外的页面的实现代码. --前台 <%@ Page Language="C#" AutoEventWireup="true&qu ...

  2. Mac下使用Homebrew 安装MySQL

    安装 brew install mysql 卸载 brew uninstall mysql 启动mysql    mysql.server start 管理员账户    mysql -uroot 

  3. 高通Quick Charge高速充电原理分析

    1 QC 2.0 1.1 高通Quick Charge 2.0 高速充电原理分析 高通的QC2.0高速充电须要手机端和充电器都要支持才行. 当将充电器端通过数据线连到手机上时,充电器默认的是将D+和D ...

  4. Android开发:《Gradle Recipes for Android》阅读笔记1.5

    这节讲的是如何如何添加JAVA依赖库. 默认的android项目有两个build.gradle文件,分别位于顶级目录,和应用自己的目录下(通常放在一个叫app的目录下面). gradle支持多种方式列 ...

  5. boost::lockfree::spsc_queue

    #include <boost/thread/thread.hpp> #include <boost/lockfree/spsc_queue.hpp> #include < ...

  6. bootstrap获取总条目数

    $('#table').on('load-success.bs.table', function () {alert($('#table').bootstrapTable('getOptions'). ...

  7. Ants(二分图最佳完美匹配)

    Ants Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6904   Accepted: 2164   Special Ju ...

  8. Redis持久化之rdb&aof

    Redis有两种持久化的方式:快照(RDB文件)和追加式文件(AOF文件) RDB持久化方式是在一个特定的间隔保存某个时间点的一个数据快照. AOF(Append only file)持久化方式则会记 ...

  9. Bootstrap Paginator分页插件+ajax

    Bootstrap Paginator分页插件下载地址: DownloadVisit Project in GitHub  Bootstrap分页插件属性介绍: http://www.cnblogs. ...

  10. django startapp报 maximum recursion depth exceeded

    报错截图如下: 解决办法:修改指定路径下的functools.py文件的def total_ordering(cls):方法: 原来的样子: convert = { '__lt__': [('__gt ...