python文件读写

文件读写的基本描述:python

open/文件操做
f=open('/tmp/hello','w')

#open(路径+文件名,读写模式)

#读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.经常使用模式

如:'rb','wb','r+b'等等函数

读写模式的类型有:spa

rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
w     以写方式打开,
a     以追加模式打开 (从 EOF 开始, 必要时建立新文件)
r+     以读写模式打开
w+     以读写模式打开 (参见 w )
a+     以读写模式打开 (参见 a )
rb     以二进制读模式打开
wb     以二进制写模式打开 (参见 w )
ab     以二进制追加模式打开 (参见 a )
rb+    以二进制读写模式打开 (参见 r+ )
wb+    以二进制读写模式打开 (参见 w+ )
ab+    以二进制读写模式打开 (参见 a+ )指针


注意:日志

一、使用'W',文件若存在,首先要清空,而后(从新)建立,对象

二、使用'a'模式 ,把全部要写入文件的数据都追加到文件的末尾,即便你使用了seek()指向文件的其余地方,若是文件不存在,将自动被建立。内存



f.read([size]) size未指定则返回整个文件,若是文件大小>2倍内存则有问题.f.read()读到文件尾时返回""(空字串)

file.readline() 返回一行

file.readline([size]) 返回包含size行的列表,size 未指定则返回所有行

for line in f: print line #经过迭代器访问

f.write("hello\n") #若是要写入字符串之外的数据,先将他转换为字符串.

f.tell() 返回一个整数,表示当前文件指针的位置(就是到文件头的比特数).

f.seek(偏移量,[起始位置])

用来移动文件指针

偏移量:单位:比特,可正可负

起始位置:0-文件头,默认值;1-当前位置;2-文件尾

f.close() 关闭文件字符串

读文件的方法:generator

read ()的方法是一次性把文件的内容以字符串的方式读到内存, 放到一个字符串变量中it

readlines()的方法是一次性读取全部内容, 并按行生成一个list ,

由于read()和readlines()是一次性把文件加载到内存, 若是文件较大, 甚至比内存的大小还大, 内存就会爆掉。 因此,这两种方法只适合读取小的文件。 

实际工做中,会碰到读取10几G的大文件的需求, 好比说日志文件。 这时候就要用的新的读取文件的方法。 这里提供两种方法, 有简单,有复杂,但基本原理都是同样的。 就是利用到生成器generator。

python 读取大文件使用迭代器会减少内存的消耗

方法1:利用open(“”, “”)系统自带方法生成的迭代对象

使用with打开文件并将文件对于对象f当作迭代对象,for line in f 这种用法是把文件对象f看成迭代对象, 系统将自动处理IO缓冲和内存管理,当读取大文件时不会一次性将文件读取到内存中,形成内存爆掉,迭代器会将需求的内容逐次读入内存

with open(file,'r') as f:
    for line in f:
       print(line)
逐行读取文件内容,避免一次将文件内容所有加载到内存中;

方法二:将文件切分红小段,每次处理完小段内容后,释放内存

这里会使用yield生成自定义可迭代对象, 即generator, 每个带有yield的函数就是一个generator。 

  1. def read_in_block(file_path):  
  2.     BLOCK_SIZE = 1024  
  3.     with open(file_path, "r") as f:  
  4.         while True:  
  5.             block = f.read(BLOCK_SIZE)  # 每次读取固定长度到内存缓冲区  
  6.             if block:  
  7.                 yield block  
  8.             else:  
  9.                 return  # 若是读取到文件末尾,则退出  
  10.   
  11.   
  12. def test3():  
  13.     file_path = "/tmp/test.log"  
  14.     for block in read_in_block(file_path):  
  15.         print block  
相关文章
相关标签/搜索