一,打开文件
open,将文件名作为唯一必不可少的参数,并返回一个文件对象,
当前目录直接输入名字+后缀,其他地方则需提供完整路径。
1.1. 文件模式(open的第二个参数——mode)
函数 open 的参数 mode 的最常见取值
值 | 描 述 |
---|---|
‘r’ | 读取模式(默认值) |
‘w’ | 写入模式 |
‘x’ | 独占写入模式 |
‘a’ | 附加模式 |
‘b’ | 二进制模式(与其他模式结合使用) |
‘t’ | 文本模式(默认值,与其他模式结合使用) |
‘+’ | 读写模式(与其他模式结合使用) |
①显式地指定读取模式的效果与根本不指定模式相同
②写入模式让你能够写入文件,并在文件不存在时创建它,以写入模式打开文件时,将会删除(截断)既有内容,并从文件开头开始写入。
③独占写入模式更进一步,在文件已存在时引发 FileExistsError 异常。
④附加模式,从既有文件尾继续写入。
⑤!!! ‘r+’ 和 ‘w+’ 之间有个重要差别:后者截断文件,而前者不会这样做。
两者都是读写
⑥默认模式为 ‘rt’ ,这意味着将把文件视为经过编码的Unicode文本,因此将自动执行解码和
编码,且默认使用UTF-8编码。要指定其他编码和Unicode错误处理策略,可使用关键字参数
encoding 和 errors。 (有关Unicode的详细信息,请参阅第1章。)这还将自动转换换行字符。默认情况下,行以 ‘\n’ 结尾。读取时将自动替换其他行尾字符( ‘\r’ 或 ‘\r\n’ );写入时将 ‘\n’ 替换为系统的默认行尾字符( os.linesep )。
1.2. open的第三个参数——newline
将newline设为空字符串,Python使用__通用换行模式__,readline方法能够识别所有合法的换行符(’\n’ , ‘\r’ , ‘\r\n’),这还会禁用自动转换。
如果指定将newline设为‘\r’,则只将‘\r’视为合法行尾字符,读入时不会转化这个行尾字符,但写入时将‘\n’替换为指定的行尾字符。
非文本用‘rb’
二,文件的基本方法
2.1 读取read 写入 write
在文本和二进制模式下,基本上分别将str和bytes类作为数据
write将写入本次打开文件后已写内容的后面。
>>> f=open('somefile.txt','w+')
>>> f.write("Hello, ")
7
>>> f.write('World!')
6
>>> f.read()
'' # close后文件写入才会被保存
>>> f.close()
>>> f = open('somefile.txt', 'r')#默认‘r’模式
>>> f.read(4)
'Hell'
>>> f.read()
'o, World!'
read参数指定读取几个,没有参数则从当前位置一直读到末尾。
(管道?P216)
2.2.随机存取
方法 seek(offset[, whence])
将当前位置(执行读取或写入的位置)移到 offset 和 whence 指定的地方。
参数 offset 指定了字节(字符)数
参数 whence 默认为 io.SEEK_SET( 0),这意味着偏移量是相对于文件开头的(偏移量不能为负数),还可设置
为 io.SEEK_CUR (1)或 io.SEEK_END(2),其中前者表示相对于当前位置进行移动(偏移量可以为负),而后者表示相对于文件末尾进行移动
方法 tell() 返回当前位于文件的什么位置
2.3.读取,写入行
readline:
不提供参数 读取一行并返回这一行。
提供非负整数,指定readline最多可读取多少个字符
readlines:
要读取文件中的所有行,并以列表的方式返回它们
writelines:
接受一个字符串列表(或任何序列或可迭代对象),并将它们写入文件(或流)中。
!!!注意:写入时并不会添加换行符
没有writeline 因为有write
三,关闭文件
close (尽管程序退出时会自动关闭文件对象)
为确保文件关闭,可用try/finally语句,在finaly中调用close
# 在这里打开文件
try:
# 将数据写入到文件中
finally:
file.close()
或用上下文管理器:
with open("somefile.txt") as somefile:#将文件对象赋给somefile
do_something(somefile)
拓展——上下文管理器;
with 语句实际上是一个非常通用的结构,允许你使用所谓的 上下文管理器。上下文管理器是支持两个方法的对象: __enter__ 和 __exit__ 。
方法 __enter__ 不接受任何参数,在进入 with 语句时被调用,其返回值被赋给关键字 as 后面的变量。
方法 __exit__ 接受三个参数:异常类型、异常对象和异常跟踪。它在离开方法时被调用(通过前述参数将引发的异常提供给它)。如果 __exit__ 返回 False ,将抑制所有的异常。
文件也可用作上下文管理器。它们的方法__enter__ 返回文件对象本身,而方法 __exit__关闭文件。
四,迭代文件内容
4.1. fileinput 延迟迭代
注意,模块 fileinput 会负责打开文件,你只需给它提供一个文件名即可
import fileinput
for line in fileinput.input(filename):
process(line)
4.2 文件迭代器
with open(filename) as f:
for line in f:
process(line)
注意:标准输入流 sys.stdin 也是可迭代的
>>> f = open('somefile.txt', 'w')
>>> print('First', 'line', file=f)
>>> print('Second', 'line', file=f)
>>> print('Third', 'and final', 'line', file=f)
>>> f.close()
>>> lines = list(open('somefile.txt'))
>>> lines
['First line\n', 'Second line\n', 'Third and final line\n']
>>> first, second, third = open('somefile.txt')
>>> first
'First line\n'
>>> second
'Second line\n'
>>> third
'Third and final line\n'
使用 print 来写入文件,这将自动在提供的字符串后面添加换行符。
对打开的文件进行序列解包,从而将每行存储到不同的变量中。(这种做法不常见,因为通常不知道文件包含多少行,但这演示了文件对象是可迭代的。)
写入文件后将其关闭,以确保数据得以写入磁盘。