《Python Cookbook 3rd》笔记(5.1):读写文本数据
读写文本数据
问题
你需要读写各种不同编码的文本数据,比如 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):读写文本数据相关推荐
- 《Python Cookbook 3rd》笔记汇总
文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...
- 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素
<Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...
- [python Cookbook]阅读笔记
@toc] 前记:为了补充一下python语法知识,感谢网友的推荐阅读了pythonCookbook,这本书确实不错,以问题为导向,引导解决思路. 这个博文是从阅读笔记typora中直接复制过来的没有 ...
- 《Python cookbook》笔记二
<Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...
- Machine Learning with Python Cookbook 学习笔记 第6章
Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...
- Python Cookbook 3rd Edition Documentation
Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...
- Machine Learning with Python Cookbook 学习笔记 第8章
Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...
- Machine Learning with Python Cookbook 学习笔记 第9章
Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...
- 北理工嵩天Python语言程序设计笔记(8 文件和数据格式化)
前言 本文是对<北理工 嵩天/黄天宇/礼欣 Python语言程序设计>的学习笔记,供自己查阅使用. 文章目录 北理工嵩天Python语言程序设计笔记(目录) 北理工嵩天Python语言程序 ...
最新文章
- 辽宁省计算机专业A类,辽宁省2008年中职升高职招生考试计算机专业综合试题
- android tab 悬停效果代码,Android 仿腾讯应用宝 之 Toolbar +Scroolview +tab滑动悬停效果...
- 职业生涯愿景计算机,职业生涯愿景
- android 6.0版本名字,棉花糖Marshmallow 是Android 6.0的名字
- 信息学奥赛一本通C++语言——1090:含k个3的数
- OpenGL:关于获取渲染结果的深度信息的问题(二)
- 对称二叉树c++_数据结构学习(C++)——平衡二叉树
- Apache OpenNLP
- 【搞定GTD】用iPhone打造GTD实践1年后的心得体会
- OpenCV C++案例实战十《车牌号识别》
- oracle loop面试题,oracle存储过程面试题
- 强大到爆的代码阅读工具understand
- C#制作UDP协议可同时收发Winform窗体
- 实践数据湖iceberg 第二十一课 flink1.13.5 + iceberg0.131 CDC(测试成功INSERT,变更操作失败)
- 智慧停车场综合解决方案
- Windows phone 8 学习笔记(8) 定位地图导航(转)
- 使用ArchR分析单细胞ATAC-seq数据(第十四章)
- 百度搜索引擎爬行蜘蛛IP大全
- super-----this
- 机器人有同理心吗?情感AI的可用性有多少?