读写文本数据

问题

你需要读写各种不同编码的文本数据,比如 ASCII,UTF-8 或 UTF-16 编码等。

解法

使用带有 rt 模式的 open() 函数读取文本文件(t表示text文本模式,默认模式,这可以省略)。如下所示:

# Read the entire file as a single string
with open('somefile.txt', 'rt') as f:data = f.read()# Iterate over the lines of the file
with open('somefile.txt', 'rt') as f:for line in f:# process line...

类似的,为了写入一个文本文件,使用带有 wt 模式的 open() 函数,如果之前文件内容存在则清除并覆盖掉。如下所示:

# Write chunks of text data
with open('somefile.txt', 'wt') as f:f.write(text1)f.write(text2)...# Redirected print statement
with open('somefile.txt', 'wt') as f:print(line1, file=f)print(line2, file=f)...

如果是在已存在文件中添加内容,使用模式为 at 的 open() 函数。

文件的读写操作默认使用系统编码,可以通过调用 sys.getdefaultencoding() 来得到。在大多数机器上面都是 utf-8 编码。如果你已经知道你要读写的文本是其他编码方式,那么可以通过传递一个可选的 encoding 参数给 open() 函数。如下所示:

with open('somefile.txt', 'rt', encoding='latin-1') as f:...

Python 支持非常多的文本编码。几个常见的编码是 ascii, latin-1, utf-8 和 utf-16。在 web 应用程序中通常都使用的是 UTF-8。ascii 对应从 U+0000 到 U+007F 范围内的 7 位字符。latin-1 是字节 0-255 到 U+0000 至 U+00FF 范围内 Unicode 字符的直接映射。当读取一个未知编码的文本时使用 latin-1 编码永远不会产生解码错误。使用latin-1 编码读取一个文件的时候也许不能产生完全正确的文本解码数据,但是它也能从中提取出足够多的有用数据。同时,如果你之后将数据回写回去,原先的数据还是会保留的。

讨论

读写文本文件一般来讲是比较简单的。但是也几点是需要注意的。首先,在例子程序中的 with 语句给被使用到的文件创建了一个上下文环境,但 with 控制块结束时,文件会自动关闭。你也可以不使用 with 语句,但是这时候你就必须记得手动关闭文件:

f = open('somefile.txt', 'rt')
data = f.read()
f.close()

另外一个问题是关于换行符的识别问题,在 Unix 和 Windows 中是不一样的 (分别是 n 和 rn)。默认情况下,Python 会以统一模式处理换行符。这种模式下,在读取文本的时候,Python 可以识别所有的普通换行符并将其转换为单个 \n 字符。类似的,在输出时会将换行符 \n 转换为系统默认的换行符。如果你不希望这种默认的处理方式,可以给 open() 函数传入参数 newline=’’ ,就像下面这样:

# Read with disabled newline translation
with open('somefile.txt', 'rt', newline='') as f:...

为了说明两者之间的差异,下面我在 Unix 机器上面读取一个 Windows 上面的文本文件,里面的内容是 hello world!\r\n :

>>> # Newline translation enabled (the default)
>>> f = open('hello.txt', 'rt')
>>> f.read()
'hello world!\n'
>>> # Newline translation disabled
>>> g = open('hello.txt', 'rt', newline='')
>>> g.read()
'hello world!\r\n'
>>>

最后一个问题就是文本文件中可能出现的编码错误。但你读取或者写入一个文本文件时,你可能会遇到一个编码或者解码错误。比如:

>>> f = open('sample.txt', 'rt', encoding='ascii')
>>> f.read()
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/local/lib/python3.3/encodings/ascii.py", line 26, in decodereturn codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
12: ordinal not in range(128)
>>>

如果出现这个错误,通常表示你读取文本时指定的编码不正确。你最好仔细阅读说明并确认你的文件编码是正确的 (比如使用 UTF-8 而不是 Latin-1 编码或其他)。如果编码错误还是存在的话,你可以给 open() 函数传递一个可选的 errors 参数来处理这些错误。下面是一些处理常见错误的方法:

>>> # Replace bad chars with Unicode U+fffd replacement char
>>> f = open('sample.txt', 'rt', encoding='ascii', errors='replace')
>>> f.read()
'Spicy Jalape?o!'
>>> # Ignore bad chars entirely
>>> g = open('sample.txt', 'rt', encoding='ascii', errors='ignore')
>>> g.read()
'Spicy Jalapeo!'
>>>

如果你经常使用 errors 参数来处理编码错误,可能会让你的生活变得很糟糕。对于文本处理的首要原则是确保你总是使用的是正确编码。当模棱两可的时候,就使用默认的设置 (通常都是 UTF-8)。

《Python Cookbook 3rd》笔记(5.1):读写文本数据相关推荐

  1. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  2. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  3. [python Cookbook]阅读笔记

    @toc] 前记:为了补充一下python语法知识,感谢网友的推荐阅读了pythonCookbook,这本书确实不错,以问题为导向,引导解决思路. 这个博文是从阅读笔记typora中直接复制过来的没有 ...

  4. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  5. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  6. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  7. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  8. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  9. 北理工嵩天Python语言程序设计笔记(8 文件和数据格式化)

    前言 本文是对<北理工 嵩天/黄天宇/礼欣 Python语言程序设计>的学习笔记,供自己查阅使用. 文章目录 北理工嵩天Python语言程序设计笔记(目录) 北理工嵩天Python语言程序 ...

最新文章

  1. 辽宁省计算机专业A类,辽宁省2008年中职升高职招生考试计算机专业综合试题
  2. android tab 悬停效果代码,Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果...
  3. 职业生涯愿景计算机,职业生涯愿景
  4. android 6.0版本名字,棉花糖Marshmallow 是Android 6.0的名字
  5. 信息学奥赛一本通C++语言——1090:含k个3的数
  6. OpenGL:关于获取渲染结果的深度信息的问题(二)
  7. 对称二叉树c++_数据结构学习(C++)——平衡二叉树
  8. Apache OpenNLP
  9. 【搞定GTD】用iPhone打造GTD实践1年后的心得体会
  10. OpenCV C++案例实战十《车牌号识别》
  11. oracle loop面试题,oracle存储过程面试题
  12. 强大到爆的代码阅读工具understand
  13. C#制作UDP协议可同时收发Winform窗体
  14. 实践数据湖iceberg 第二十一课 flink1.13.5 + iceberg0.131 CDC(测试成功INSERT,变更操作失败)
  15. 智慧停车场综合解决方案
  16. Windows phone 8 学习笔记(8) 定位地图导航(转)
  17. 使用ArchR分析单细胞ATAC-seq数据(第十四章)
  18. 百度搜索引擎爬行蜘蛛IP大全
  19. super-----this
  20. 机器人有同理心吗?情感AI的可用性有多少?

热门文章

  1. 交易机项目工作日志--2013-01-30
  2. 怎样在PropertySheet中添加按钮
  3. 如何修改wince的网络配置
  4. WINCE 网卡控制
  5. nfc reader智能解码程序_更关注健康的高性价比智能手表 华米Amazfit Pop体验
  6. java aqs源码_java中AQS源码分析
  7. 【转】三、QT例子-打开一个图片并且显示
  8. 【转】【MySQL】事务与锁(四):行锁到底锁住的是什么?记录?字段?索引?
  9. 第十节:利用async和await简化异步编程模式的几种写法
  10. 设计模式(一)预备知识