【python教程】6、文件

1、打开文件

open 函数,位于自动导入的模块 io 中,返回一个文件对象。

>>>f = open('somefile.txt')
'''
1、open的参数 mode默认值为:rt(将文件视为经过编码的Unicode文本,因此将自动执行解码和编码,默认使用UTF-8编码,还将自动转换换行字符)

2、默认情况下,行以'
'结尾。读取时将自动替换其他行尾字符('
'或'
');写入时将'
'替换为系统的默认行尾字符

3、指定其他编码和Unicode错误处理策略,使用关键字参数:encoding和errors

4、mode(文件模式)最常见的取值:
'r':读取模式(默认值)
'w':写入模式,文件不存在时创建;打开文件时,既有内容将被删除(截断),并从文件开头开始写入
'x':独占写入模式,在文件已存在时引发FileExistsError异常
'a':附加模式,在既有文件末尾继续写入
'b':二进制模式(与其他模式结合使用,会关闭Unicode编码和换行符替换)
't':文本模式(默认值,与其他模式结合使用)
'+':读写模式(可与其他任何模式结合,表示可读可写)。'r+'和'w+'的重要差别:后者会截断文件。

5、通常,python使用‘通用换行模式’。在这种模式下,readlines等方法能够识别所有合法的换行符('
'、
'和'
')。
  若要使用这种模式,同时禁止自动转换,可设置关键字参数newline='';
  若要只指定'
'为合法的行尾字符,设置参数newline='
'即可(这样读取时不会对行尾字符进行转换,但写入时会把'
'替换为指定的行尾字符)。
  
6、若文件包含非文本的二进制数据,如声音剪辑片段或图像,你肯定不希望执行上述的自动转行,执行使用二进制模式(rb)来禁用与文本相关的功能。
'''

2、文件的基本方法

类似于文件的对象(有时称为:流)支持文件对象的一些方法,如支持read或weite,或两者都支持。urlopen返回的对象就是典型的 类似于文件的对象,它支持read和readline,但不支持write和isatty。

模块sys中的三个标准流(这些流都是 类似于文件的对象):

  • 标准数据输入源:sys.stdin
  • 提供给print的文本和向input提供的提示信息会出现在 sys.stdout 中,写入到sys.stdout的数据通常出现在屏幕上
  • 错误消息(如栈跟踪)被写入到sys.stderr

1、文件的读取和写入:f.read 和 f.write(f:类似于文件的对象)

2、使用管道重定向输出:$ cat somefile.txt | python somescript.py | sort

  • cat somefile.txt:将文件中的内容写入到标准输出 sys.stdout;
  • 管道字符(|):将一个命令的标准输出链接到下一个命令的标准输入
  • somescript.py中内容如下:
import sys
text = sys.stdin.read()
words = text.split()
print('wordcount', len(words))

3、随机存取:

此节中,将文件视为流,只能按顺序从头到尾读取。实际上,可在文件中移动,只访问感兴趣的部分(称为随机读取)。可使用文件对象的两个方法:seek和tell

seek(offset[, whence]):将当前位置(执行读取和写入的位置)移到offset和whence指定的地方。

  • offset:指定了字节(字符)数;
  • whence:默认值为io.SEEK_SET(0),偏移量相对于文件开头的(偏移量不能为负数);还可设置为io.SEEK_CUR(1),相对于当前位置进行移动,偏移量可为负;或io.SEEK_END(2),相对于文件末尾进行移动
# 1、方法seek()
f = open(r'c:data.txt', 'w')
f.write('0123456789')
f.seek(2)
f.write('world')
f.close()

f = open(r'c:data.txt')
f.read()  # 结果为:'01world789'

# 2、方法tell():返回当前位于文件的什么位置
>>> f = open(r'c:data.txt')
>>> f.read(2)  # '01'
>>> f.read(1)  # 'w'
>>> f.tell()  # 3

4、读取和写入行

readline:可不提供任何参数,读取一行(从当前位置到下一个分行符的文本);也可提供一个非负整数,指定读取多少个字符。

readlines:读取文件中的所有行,并以列表的方式放回

writelines:接受一个字符串列表(可以是任何序列或可迭代对象),并将这些字符串写入到文件(或流)中。注意:写入时不会添加换行符,须自行添加;另外,没有方法writeline,可使用write。

5、关闭文件

通常,程序退出时将自动关闭文件对象(也可能在退出程序前)。关闭文件,在有些操作系统和设置中,可避免无意义地锁定文件以防修改;还可避免用完系统可能指定的文件打开配额。

对于写入过的文件,一定要将其关闭,因为python可能会缓冲你写入的数据,如果程序因某种原因崩溃,数据可能不会写入到文件中。

若要重置缓冲,让修改反映到磁盘文件中,但又不想关闭文件,可使用方法flush。但根据使用的操作系统和设置,flush可能处于锁定考虑而禁止其他正在运行的程序访问这个文件。

确保文件得以关闭:

# 1、使用try/finally语句
# 在这里打开文件
try:
    # 将数据写入到文件中
finally:
    file.close()

# 2、使用with语句:到达语句末尾时,将自动关闭文件,即便出现异常亦如此。with实际上是个非常通用的结构,允许你使用所谓的上下文管理器。
with open('file.txt') as f:
    do_something(f)

6、上下文管理器:是支持两个方法的对象,__enter____exit__

__enter__:不接受任何参数,在进入with语句时被调用,其返回只被赋给关键字as后面的变量。

__exit__:接受三个参数:异常类型、异常对象和异常跟踪。在离开方法时调用。若返回False,将抑制所有的异常。

文件也可用作上下文管理器。__enter__返回文件对象本身,__exit__关闭文件

3、迭代文件内容

1、每次迭代一个字符(或字节)

# 1、使用read遍历字符
with open('file.txt') as f:
    char = f.read(1)
    where char:  # 到达文件末尾时,将返回一个空字符串
        print('processing:', char)
	char = f.read(1)  # 此语句重复,通常被视为坏事

# 2、使用read遍历字符--优化(胜过例1,避免了重复代码)
with open('file.txt') as f:
    where Ture:
	char = f.read(1)
	if not char:
            break  # 过多的使用break,会导致代码更难理解,但这里避免了重复代码
	    print('processing:', char)  # 这里与上面的示例重复,可写一个方法

2、每次迭代一行,使用readline遍历

with open('file.txt') as f:
    where True:
	line = f.readline()
        if not line:
	    break
	    print('processing:', line)

3、读取所有内容(文件不大时)

# 1、使用read迭代所有字符(方法read将整个文件读取到一个字符串中)
with open('file.txt') as f:
    for char in f.read():
	print('processing:', char)
		
# 2、使用readline迭代行
with open('file.txt') as f:
    for line in f.readlines():
	print('processing:', line)

4、使用fileinput实现延迟行迭代(延迟:只读取实际需要的文本部分)

# 迭代大型文件的行时,用readlines会占用很多内存,可结合使用while和readline,但在python中,在有可能时,应首选for循环
import fileinput  # filename会打开文件
for line in fileinput.input(filename):  # input帮助迭代多个输入流中的行
    print('processing:', line)

5、文件迭代器(文件是可迭代的,可在for循环中使用文件来迭代行)(最常见的方法)

# 1、迭代文件,使用with确保文件得以关闭
with open(filename) as f:
    for line in f:
	print('processing:', line)
		
# 2、迭代文件:不将文件对象赋给变量(不写入文件时可这样操作),让python负责关闭文件
for line in open(filename):
    print('processing:', line)
	
# 3、迭代sys.stdin(标准输入)
import sys
for line in sys.stdin:
    print('processing:', line)
	
# 4、可对迭代做的事情基本都可对文件做
# 使用print来写入文件,将自动在提供的字符串后添加换行符
>>> f = open('file.txt', 'w')
>>> print('First', 'line', file=f)
>>> print('Second', 'line', file=f)
>>> f.close()
# 将行转换为字符串列表
>>>lines = list(open('file.txt'))
# 对打开的文件进行序列解包(不常见,因为不知道文件包含多少行)
first, second = open('file.txt')  # 读取文件后并没有关闭,会有点粗糙,但并非致命
原文地址:https://www.cnblogs.com/mind18/p/15067982.html