python cookbook 学习笔记 第五章 文件与IO (1)读写文本数据

  • 读写文本数据
  • 问题:
    • 需要读写各种不同编码的文本数据,比如ASCII, UTF-8, UTF-16编码等。
  • 解决方案:
    • 使用带有rt模式的 open()函数读取文本文件:
with open("somefile.txt", "rt") as f:
    data = f.read()

with open("somefile.txt", "rt") as f:
    for line in f:
        pass
  • 类似,为了写入一个文本文件,使用带有 wt 模式的open()函数,如果之前文件内容存在,则清空并覆盖:
with open("somefile.txt", "wt") as f:
    f.write("text1")
    f.write("text2")
  • 如果是在已存在文件中添加内容,使用模式为 at 的 open()函数。
  • 文件的读写操作默认使用系统编码,可以通过 sys.getdefaultencoding()来得到。在大多数机器上都是utf-8 编码。如果已经知道要读写的文本是其他编码方式,可以通过传递一个可选的 encoding 参数给open()函数:
with open(r"E:\test\python进阶\Python_cookbook_第四章\Python_cookbook_第四章(1).py",
          encoding= "latin-1") as f:
    for line in f:
        print(line, end="")
  • 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= “”,就像下面这样:

with open("somefile.txt", "rt", newline= "") as f:
    pass
  • 下面是读取 windows 上面的文本文件:
f = open("hello.txt", "rt")
f.read()  # "hello world!\n"

g = open("hello.txt", "rt", newline= "")
g.read()  # "hello world!\r\n"
  • 最后一个问题就是文本文件中可能出现的编码错误。读取或写入一个文本文件时,可能回遇到一个编码或者解码错误,比如:
f = open("sample.txt", "rt", encoding= utf-8)
f.read()
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position
  • 如果出现这个错误,通常表示读取的文本指定的编码不正确。在检查编码后,如果还是存在错误的话,可以给open()函数 传递一个可选的 errors 参数来处理这些错误:
f = open("sample.txt", "rt", encoding= "ascii", errors= "replace")
f.read()
f = open("sample.txt", "rt", encoding="ascii", errors= "ignore")
f.read()
  • 对于文本处理的首要原则是编码正确。通常 web 应用的编码都是 utf-8(默认值)

你可能感兴趣的:(Python,cookbook,学习笔记,第五章)