python文件操作
Posted jeancheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python文件操作相关的知识,希望对你有一定的参考价值。
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
使用python的with语句
实现在处理文件时,无论是否抛出了异常,都能保证with语句执行完毕后关闭已打开的文件
with open(file, mode=\'r\') as target:
with-body
open(file, mode=\'r\', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener:
mode模式参数值
以二进制形式打开文件
使用open函数不仅可以以文本的形式打开文件,而且可以以二进制形式打开非文本文件,如图片、音频、视频文件等
>>> file=open(\'test.txt\',\'r\')
>>> file
<_io.TextIOWrapper name=\'test.txt\' mode=\'r\' encoding=\'cp936\'>
>>> file.read()
\'123456789\\n234567890\\n345678901\'
>>> file1=open(\'test.jpg\',\'rb\')
>>> file1
<_io.BufferedReader name=\'test.jpg\'>
创建的是一个bufferreader对象。该对象生成后,可以再应用其他的第三方模块进行处理。
打开文件时指定编码方式
open函数打开文件时,默认采用GBK编码,当打开的文件不是GBK编码时,会抛出异常
通过添加encoding=\'编码方式\'解决
>>> file = open(\'utf8.txt\',\'r\')
>>> file.read()
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
file.read()
UnicodeDecodeError: \'gbk\' codec can\'t decode byte 0xbf in position 2: illegal multibyte sequence
>>> file.close()
以utf-8编码打开
>>> file = open(\'utf8.txt\',\'r\',encoding=\'utf-8\')
>>> print(file.read())
123
>>> file.close()
文件内容的读取
file.read([size])
从文件读取指定的字节数,如果未给定或为负则读取所有。
>>> with open(\'utf8.txt\',\'r\',encoding=\'utf-8\') as f:
f.read()
\'\\ufeff123\\n456\\n789\'
file.readline([size])
读取整行,包括 "\\n" 字符。
>>> with open(\'utf8.txt\',\'r\',encoding=\'utf-8\') as f:
f.readline()
\'\\ufeff123\\n\'
file.readlines([sizeint])
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
>>> with open(\'utf8.txt\',\'r\',encoding=\'utf-8\') as f:
f.readlines()
[\'\\ufeff123\\n\', \'456\\n\', \'789\']
文件迭代器
>>> with open(\'utf8.txt\',\'r\',encoding=\'utf-8\') as f:
for line in f:
print(line,end=\'\')
123
456
789
总结
像read(),readlines()这种一次性全部读取的方式在大多数情况下并非良方
如果是一个大文件,它会占用大量内存,甚至可能会因为内存不足而读取失败。
但并非必须要选择for line in open(\'a.txt\')的方式,因为有些时候必须加载整个文件才能进行后续的操作,比如要排序文件,必须要拥有文件的所有数据才能进行排序。而且对于小文件来说,一次性读取到一个列表中操作起来可能会更加方便,因为列表对象有很多好用的方法。所以,不能一概而论地选择for line in open(\'a.txt\')。
读取出来的内容,都带行尾的换行符,可以使用字符串的strip()方法去除。
文件内容的写入
file.write(str)
将字符串写入文件,返回的是写入的字符长度。不会自动加入换行符
>>> with open(\'test.txt\',\'w\') as f:
f.write(\'line1\')
f.write(\'line2\'+\'\\n\')
5
6
>>> with open(\'test.txt\',\'r\') as f:
f.read()
\'line1line2\\n\'
file.writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
>>> data = [\'line1\',\'line2\',\'line3\']
>>> with open(\'test.txt\',\'w\') as f:
f.writelines(data)
>>> with open(\'test.txt\',\'r\') as f:
f.read()
\'line1line2line3\'
以上是关于python文件操作的主要内容,如果未能解决你的问题,请参考以下文章