码迷,mamicode.com
首页 > 编程语言 > 详细

python文件操作

时间:2020-07-21 09:48:17      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:迭代器   ade   most   With语句   缓冲   none   code   open()   recent   

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文件操作

标签:迭代器   ade   most   With语句   缓冲   none   code   open()   recent   

原文地址:https://www.cnblogs.com/jeancheng/p/13352040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!