Python 操作文件

open() 函数

模式 说明
r 只读模式
w 只写模式,文件不存在自动创建;存在则清空再写
a 只追加写,在文件最后追加写
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
w+ 打开一个文件用于写读,若文件已存在则将其清空,若该文件不存在,创建新文件。
a+ 打开一个文件用于读写。若文件已存在,文件指针将会在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

这里我们操作的文件
mytest 内容为:

1111111111111
2222222222222
3333333333333

readline 函数

f = open('mytest', 'r', encoding="utf8")  # 以读模式打开
print(f.readline())                       # 读一行内容
print(f.readline())
print(f.readline())
print(f.readline())
f.close()                                 # 关闭文件

运行结果:

注意:
readline 函数会返回一行文件内容,因为 print 函数会换行,而文本中每行有 \n 这个换行符,所以每行内容之间会多了一个空白行。


readlines 函数

f = open('mytest', 'r', encoding="utf8")
print(f.readlines())                                # 读取所有内容,以列表形式返回
f.close()

运行结果:

f = open('mytest', 'r', encoding="utf8")
for i in f.readlines():
    print(i.strip())                 # 通过 strip 函数除去每行后面的 \n 换行符
f.close()

运行结果:


需求:在文件第二行末尾加入 'klvchen'

number = 0
f = open('mytest', 'r', encoding="utf8")
for i in f.readlines():
    number += 1
    if number == 2:
        print(i.strip()+'klvchen')
    else:
        print(i.strip())
f.close()

运行结果:

优化版本(一):

number = 0
f = open('mytest', 'r', encoding="utf8")
for i in f.readlines():
    number += 1
    if number == 2:
        i = "".join([i.strip(), 'klvchen'])
    print(i.strip())
f.close()

运行结果:

优化版本(二):

number = 0
f = open('mytest', 'r', encoding="utf8")  
for i in f:                             # for内部将 f 对象做成一个迭代器,用一行取一行,避免占用过多内存
    number += 1
    if number == 2:
        i = "".join([i.strip(), 'klvchen'])
    print(i.strip())
f.close()

运行结果:


tell() 函数

作用:返回文件的当前位置,即文件指针当前位置。

f = open('mytest', 'r', encoding='utf8')
print(f.tell())
print(f.read(10))
print(f.tell())
f.close()

运行结果:


seek() 函数

作用: 移动文件读取指针到指定位置。

f = open('mytest', 'r', encoding='utf8')
print(f.tell())
print(f.read(10))
print(f.tell())
f.seek(0)
print(f.tell())
print(f.read(10))
f.close()

运行结果:


flush() 函数

作用: 刷新缓冲区,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

import sys, time 
for i in range(30):
    sys.stdout.write("*")
    sys.stdout.flush()
    time.sleep(0.1)

运行结果:

注意:这是个进度条的展示

类似的实现可以使用下面代码:

import time
for i in range(30):
    print("*", end='', flush=True) # print 函数也可以设置 flush 参数
    time.sleep(0.1)

在文件第二行后面添加内容

f_read = open('mytest', 'r', encoding='utf-8')
f_write = open('mytest2', 'w', encoding='utf-8')
number = 0
for line in f_read:
    number += 1
    if number == 2:
        line = ''.join([line.strip(), ' hello \n'])
    f_write.write(line)

f_write.close()
f_read.close()

运行结果:

使用另外一种方法打开文件,open 不需要自己调用 close()方法关闭

number = 0
with open('mytest', 'r') as f_read, open('mytest2', 'w') as f_write:
    for line in f_read:
        number += 1
        if number == 2:
            line = ''.join([line.strip(), ' hello \n'])
        f_write.write(line)

运行结果:

posted @ 2018-03-29 17:12  klvchen  阅读(233)  评论(0编辑  收藏  举报