比Open更适合读取文件的Python内置模块

有时我们需要把数据永久存储起来,随时使用随时读取。例如,我们通过程序建立的列表、字典等数据,当程序结束时,需要把这些数据存储到文件中,当程序再次启动时,可以把这些数据读入到程序中,避免这些数据的重新录入。

Python语言中,负责文件操作的称为文件对象,文件对象不仅可以访问存储在磁盘中的文件,也可以访问网络文件。文件对象通过open函数得到,获取文件对象后,就可以使用文件对象提供的方法来读写文件。

open函数在处理某些问题是并不是很理想,有没有其他比open函数更加适合读取某些特定文件呢?下面我们就一起来看看!

回顾open函数

对文件操作使用最频繁对函数,open()打开一个文件对象,使用Python内置的open()函数,传入文件名和模式

file_object = open(name [, mode][, buffering])

name: 要读取的文件名称。

mode: 打开文件的模式,选填。r, r+, w, w+, a, a+使用最多。

buffering: 文件所需的缓冲区大小, 选填。0表示无缓冲, 1表示线路缓冲。有四种打开文件的不同方法(模式)

  • "r" - 读取 - 默认值。打开文件进行读取,如果文件不存在则报错。

  • "a" - 追加 - 打开供追加的文件,如果不存在则创建该文件。

  • "w" - 写入 - 打开文件进行写入,如果文件不存在则创建该文件。

  • "x" - 创建 - 创建指定的文件,如果文件存在则返回错误。

此外,可以指定文件是应该作为二进制还是文本模式进行处理。

  • "t" - 文本 - 默认值。文本模式。

  • "b" - 二进制 - 二进制模式(例如图像)。

使用时常通过with open()方法读写文件。

with open("文件名.txt", "r") as fin: # fin为 别名(文件句柄对象)
  file =  fin.read() # 会一次性读取文件的全部内容
    file_line = fin.readline() # 可以每次读取一行内容
    file_lines = fin.readlines() # 一次读取所有内容并按行返回list

pathlib


以前在Python中操作文件路径,更多的时候是使用os模块。Python3的系统标准库pathlib模块的Path对路径的操作会更简单。

pathlib的一些基本操作,如文件名操作、路径操作、文件操作等等并不在本文讨论范围。本此介绍使用率非常高的文件操作,其文件读写方法。

Path.open

pathlib里如果要打开一个文件十分的简单。

Path.open(mode='r', 
          buffering=-1, 
          encoding=None, 
          errors=None, 
          newline=None)

打开路径指向的文件,就像内置的open()函数所做的一样。

from pathlib2 import Path
example_path = Path('./info.csv')
with example_path.open() as f:
   print(f.readline())
   print(f.read())

结果

"编号","性别","年龄","成绩"

961067,"男",23,97
969157,"男",38,98
969237,"男",27,120
970394,"男",27,118

Path读与写

对于简单的文件读写,在pathlib模块中有几个简便的方法:

Path.read_text(): 以字符串形式返回路径指向的文件的解码后文本内容。

Path.read_bytes(): 以二进制/字节模式打开路径并以字节串的形式返回内容。

Path.write_text(): 打开路径并向其写入字符串数据。

Path.write_bytes(): 以二进制/字节模式打开路径并向其写入数据。

>>> p = Path('my_binary_file')
>>> p.write_bytes(b'Binary file contents')
20
>>> p.read_bytes()
b'Binary file contents'

>>> p = Path('my_text_file')
>>> p.write_text('Text file contents')
18
>>> p.read_text()
'Text file contents'

更多详情可参见pathlib模块[1]。

fileinput


如果你只想读取一个文件,使用open()。如果需要实现文件列表的批量循环操作,不妨使用本模块。

fileinput.input

inputfileinput模块的初始接口,其使用也是较简单。

fileinput.input(files=None, 
                inplace=False, 
                backup='', 
                *, 
                mode='r', 
                openhook=None)

files 需要读取的文件对象,可迭代对象。

inplace 标准输出重定向替换,表示是否将标准输出的结果写回文件,默认不取代。

backup 读取时同时备份文件,可以指定备份的后缀名,比如 backup='.bak'

mode  文件读取模式,fileinput 有且仅有这两种读取模式r和 rb

  • 默认使用 mode='r'

  • 如果文件是二进制的,可以使用mode='rb' 模式。

openhook 支持用户传入自定义的对象读取方法。fileinput 内置了两个勾子函数:

  • fileinput.hook_encoded(encodingerrors=None

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值