美文网首页
python读写文件

python读写文件

作者: YYL07 | 来源:发表于2018-02-07 13:57 被阅读0次

1. 打开文件

使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。

fp = open(name, mode, buffering)

入口参数:
  name:文件名
  mode:选项、字符串
  buffering:是否缓冲(0=不缓冲,1=缓冲,>1的int数=缓冲区大小)

返回值:文件对象

方法一:复杂写法

try:
    f = open('xxx')
except:
    print 'fail to open'
    exit(-1)
try:
    do something
except:
    do something
finally:
    f.close()

方法二:简单写法

with open('thefile.txt') as file_object:
    all_the_text = file_object.read( )

这种方式,系统会自动帮你关闭文件

分析:
不安全写法:

file_object = open('thefile.txt')
try:
    all_the_text = file_object.read( )
finally:
    file_object.close( )
注:这种方式可能会出错,当文件没有打开时,程序会出错

错误写法:

try:
    file_object = open('thefile.txt')
    all_the_text = file_object.read( )
except:
    do something
finally:
    file_object.close( )

注:这种方式看似正常,但是有很大隐患,因为把open语句放在try块里,当打开文件出现异常时,文件对象file_object无法执行close()方法。

2. 读文件

读文本文件

input = open('data', 'r')       # 第二个参数默认为r, 可不传
input = open('data', 'rb')      # 读二进制文件

读取所有内容

with open('thefile.txt') as file_object:
    all_the_text = file_object.read( )

读固定字节

with open('abinfile', 'rb') as file_object:
try:
    while True:
        chunk = file_object.read(100)
        if not chunk:
            break
        do_something_with(chunk)
except:
        do ...

读每行

list_of_all_the_lines = file_object.readlines( )

如果文件是文本文件,还可以直接遍历文件对象获取每行:

for line in file_object:
     process line

size为读取的长度,以byte为单位

F.read([size]) 
F.readline([size]) 

读一行,如果定义了size,有可能返回的只是一行的一部分

F.readlines([size])
 
把文件每一行作为一个list的一个成员,并返回这个list。
其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。

3. 写文件

output = open('data', 'w')          # 写文本文件
output = open('data', 'wb')         # 写二进制文件
output = open('data', 'a')          # 追加写文件

一次性写入数据

file_object.write(all_the_text)

写入多行

file_object.writelines(list_of_text_strings)
注意:调用writelines写入多行在性能上会比使用write一次性写入要高。

在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。
在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例:

file = open('test.log', 'r')
sizehint = 209715200   # 200M
position = 0
lines = file.readlines(sizehint)
while not file.tell() - position < 0:       
    position = file.tell()       
    lines = file.readlines(sizehint)

每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。

4. 文件其他操作

函数 说明
F.flush() 把缓冲区的内容写入硬盘
F.fileno() 返回一个长整型的”文件标签“
F.isatty() 文件是否是一个终端设备文件(unix系统中的)
F.tell() 返回文件操作标记的当前位置,以文件的开头为原点
F.next() 返回下一行,并将文件操作标记位移到下一行。把一个file用于for ... in file这样的语句时,就是调用next()函数来实现遍历的。
F.seek(offset[,whence]) 将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
F.truncate([size]) 把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。

5. 模式

模式 说明
"r" 以读方式打开,只能读文件 , 如果文件不存在,会发生异常
"r+" 以可读写方式打开文件,该文件必须存在,否则会发生异常
"w" # 以写方式打开,只能写文件, 如果文件不存在,创建该文件,如果文件已存在,先清空,再打开文件
"w+" 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
"a" 以附加方式打开可写的文件,文件不存在会自动创建文件。
"a+" 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
"rb" 以二进制读方式打开,只能读文件 , 如果文件不存在,会发生异常
"wb" 以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件, 如果文件已存在,先清空,再打开文件
"rt" 以文本读方式打开,只能读文件 , 如果文件不存在,会发生异常
"wt" 以文本写方式打开,只能写文件, 如果文件不存在,创建该文件,如果文件已存在,先清空,再打开文件
"rb+" 以二进制读方式打开,可以读、写文件 , 如果文件不存在,会发生异常
"wb+" 以二进制写方式打开,可以读、写文件, 如果文件不存在,创建该文件,如果文件已存在,先清空,再打开文件

相关文章

网友评论

      本文标题:python读写文件

      本文链接:https://www.haomeiwen.com/subject/kvutfxtx.html