Python写入文件(write和writelines)详解

如果以 r+、w、w+、a、a+ 模式打开文件,则都可以写入。需要指出的是,当以 r+、w、w+ 模式打开文件时,文件指针位于文件开头处;当以 a、a+ 模式打开文件时,文件指针位于文件结尾处。

另外,需要说明的是,当以 w 或 w+ 模式打开文件时,程序会立即清空文件的内容。

文件指针的概念

文件指针用于标明文件读写的位置。假如把文件看成一个水流,文件中每个数据(以 b 模式打开,每个数据就是一个字节;以普通模式打开,每个数据就是一个字符)就相当于一个水滴,而文件指针就标明了文件将要读写哪个位置。

图 1 简单示意了文件指针的概念。

图 1 文件指针概念示意图

文件对象提供了以下方法来操作文件指针:

  • seek(offset[, whence]):该方法把文件指针移动到指定位置。当 whence 为 0 时(这是默认值),表明从文件开头开始计算,比如将 offset 设为 3,就是将文件指针移动到第 3 处;当 whence 为 1 时,表明从指针当前位置开始计算,比如文件指针当前在第 5 处,将 offset 设为 3,就是将文件指针移动到第 8 处;当 whence 为 2 时,表明从文件结尾开始计算,比如将 offset 设为 3,表明将文件指针移动到文件结尾倒数第 3 处。
  • tell():判断文件指针的位置。

此外,当程序使用文件对象读写数据时,文件指针会自动向后移动:读写了多少个数据,文件指针就自动向后移动多少个位置。

下面程序示范了文件指针操作:

  1. f = open('filept_test.py', 'rb')
  2. # 判断文件指针的位置
  3. print(f.tell()) # 0
  4. # 将文件指针移动到3处
  5. f.seek(3)
  6. print(f.tell()) # 3
  7. # 读取一个字节,文件指针自动后移1个数据
  8. print(f.read(1)) # o
  9. print(f.tell()) # 4
  10. # 将文件指针移动到5处
  11. f.seek(5)
  12. print(f.tell()) # 5
  13. # 将文件指针向后移动5个数据
  14. f.seek(5, 1)
  15. print(f.tell()) # 10
  16. # 将文件指针移动到倒数第10处
  17. f.seek(-10, 2)
  18. print(f.tell())
  19. print(f.read(1)) # d

上面程序示范了使用 seek() 方法来移动文件指针,包括从文件开头、指针当前位置、文件结尾处开始计算。运行上面程序,结合程序输出结果可以体会文件指针移动的效果。

当文件指针位于哪里时,程序就会读取哪个位置的数据;当程序读取多少个数据时,文件指针就会自动向后移动多少个位置。

输出内容

文件对象提供的写文件的方法主要有两个:

  1. write(str 或 bytes):输出字符串或字节串。只有以二进制模式(b 模式)打开的文件才能写入字节串。
  2. writelines(可迭代对象):输出多个字符串或多个字节串。

下面程序示范了使用 write() 和 writelines() 输出字符串:

  1. import os
  2. f = open('x.txt', 'w+')
  3. # os.linesep代表当前操作系统上的换行符
  4. f.write('我爱Python' + os.linesep)
  5. f.writelines(('土门壁甚坚,'+ os.linesep,
  6. '杏园度亦难。'+ os.linesep,
  7. '势异邺城下,'+ os.linesep,
  8. '纵死时犹宽。'+ os.linesep))

上面程序中第 4 行代码调用 write() 方法输出单个字符串;第 5 行代码则调用 writelines() 方法输出多个字符串。

当采用上面方法输出文件时,程序会使用当前操作系统默认的字符集。如果需要使用指定的字符集来输出文件,则可以来用二进制形式(程序先将所输出的字符串转换成指定字符集对应的二进制数据(字节串),然后输出二进制数据)。

下面程序示范了使用二进制数据输出,通过这种方式来实现以 UTF-8 字符集保存文件:

  1. import os
  2. f = open('y.txt', 'wb+')
  3. # os.linesep代表当前操作系统上的换行符
  4. f.write(('我爱Python' + os.linesep).encode('utf-8'))
  5. f.writelines((('土门壁甚坚,'+ os.linesep).encode('utf-8'),
  6. ('杏园度亦难。'+ os.linesep).encode('utf-8'),
  7. ('势异邺城下,'+ os.linesep).encode('utf-8'),
  8. ('纵死时犹宽。'+ os.linesep).encode('utf-8')))

上面程序中的代码以 wb+ 模式打开文件,这意味着程序会以二进制形式来输出文件,此时程序输出的必须是宇节串,不能是字符串。因此,程序调用 encode() 方法将字符串转换成字节串,转换时指定使用 UTF-8 字符集,这意味着程序将会以 UTF-8 字符集来保存文件。

该程序输出的文件内容与上一个程序输出的文件内容相同,只是该程序输出的文件内容是以 UTF-8 字符集保存的。

从上面的程序可以看到,当使用 w+、wb+ 模式打开文件时,会导致文件内容被清空。因此,无论程序运行多少次,其输出的文件内容都只保留最近一次的输出数据。如果程序希望在文件后面追加内容,则应该使用 a+ 或 ab+ 模式。例如如下程序:

  1. import os
  2. f = open('z.txt', 'a+')
  3. # os.linesep代表当前操作系统上的换行符
  4. f.write('我爱Python' + os.linesep)
  5. f.writelines(('土门壁甚坚,'+ os.linesep,
  6. '杏园度亦难。'+ os.linesep,
  7. '势异邺城下,'+ os.linesep,
  8. '纵死时犹宽。'+ os.linesep))

上面程序以 a+ 模式打开指定文件,这意味着以追加模式来打开文件,因此,使用 open() 函数打开文件后,不会立即清空文件内容,并且会将文件指针移动到文件结尾处,程序会在文件结尾处追加内容。

每次运行上面程序,都会向 z.txt 文件中追加一段内容;程序运行的次数越多,z.txt 文件的内容就会越多。

(0)

相关推荐

  • Python 解决相对路径问题:“No such file or directory”

    如果你取相对路径不是在主文件里,可能就会有相对路径问题:"No such file or directory". 因为 python 的相对路径,相对的都是主文件. 如下目录结构: ...

  • 第15关精华笔记

    第15关精华笔记pdf版--同学记得打开电脑浏览器下载哦!  副本_第15关精华笔记.pdf 0.4MB  什么是编码? 计算机只认识0和1,为了更好的交流,这种从人类语言到计算机语言转换的形式, ...

  • 浅谈 Python 2 中的编码问题

    Python 2.x 里的编码实在是一件令人烦躁的事情.不断有初学者被此问题搞得晕头转向.我自己也在很长一段时间内深受其害,直到现在也仍会在开发中偶尔被坑.在本教室的提问和讨论中,编码问题也占据了相当 ...

  • python中read() readline()以及readlines()对比(转)

    该篇文章主要是记录python中操作文件的三个函数read(),readline()以及readlines()之间的区别. 首先先给出结论: .read() 每次读取整个文件,它通常将读取到底文件内容 ...

  • 用原生的方式操作Excel,Python玩转Excel神器xlsxwriter详解!

    大家好,在之前的Python办公自动化系列文章中,我们已经介绍了两个Python操作Excel的库openpyxl与xlwings,并且相信大家已经了解这两者之间的异同. 但是在Python中操作Ex ...

  • Python运维自动化psutil 模块详解(超级详细)

    psutil 模块 参考官方文档:https://pypi.org/project/psutil/ 一.psutil简介 psutil是一个开源且跨平台(http://code.google.com/ ...

  • python测试开发django-11.模型models详解

    前言 Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库 只需要在settings ...

  • 超全整理|Python 操作 Excel 库常用操作详解

    来源:早起Python 作者:陈熹.刘早起 大家好,我是早起. 在之前的文章中我们曾详细的讲解了如何使用openpyxl 操作Excel,其实在Python中还有其他可以直接操作 Excel 文件的库 ...

  • Python使用pyodbc访问数据库操作方法详解

    本文实例讲述了Python使用pyodbc访问数据库操作方法. 数据库连接 数据库连接网上大致有两种方法,一种是使用pyodbc,另一种是使用win32com.client,测试了很多遍,最终只有py ...

  • c#中使用api(shfileoperation)进行文件操作,特别详解了回收站相关参数

    项目中使用了磁盘阵列柜,每秒有上百兆的数据存入磁盘,这就有了从磁盘删除文件的需求.为了满足这一需求,我做了一个用于删除过期数据的系统服务.说来这个东西本身是很简单的,但是由于数据量的巨大价值磁盘阵列空 ...

  • ArcGIS之shp文件坐标系互转详解

    准备 arcgis10.4 shp文件,没有定义坐标系,格式是经纬度的 准备的数据如下: 1.先将shp文件定义为EPSG:4326 首先打开arctoolbox,双击Define Projectio ...

  • 安卓手机系统中各类英文文件夹的含义详解,不知道的尽快熟知!

    说到手机,不管是安卓版还是苹果版的手机,总是会有很多地方让人头疼,不是因为不好用,而是因为不认识,完全不知道干嘛用的.看来使用手机,还需要将自己的英文学好,这样才不会导致自己的手机内存不够用和误删除一 ...

  • Python os.join方法(用法详解)

    本文整理汇总了后端语言Python中os.join方法的典型用法及代码示例,这里的代码示例可能为您提供帮助.也可以进一步了解该方法所在模块os的用法示例. 如果想了解web前端内容,包括html,cs ...