Python-Basis-6th

周二,晴,记录生活分享点滴

参考博客:https://www.cnblogs.com/yuanchenqi/articles/5782764.html

Python版本:3.5

 

文件操作基本流程

需知:能调用方法的一定是对象

li=[1,2,3]  #li是对象
li.append('2')  #li是对象
'asc'.capitalize()  #asc是对象

流程:1.创建文件对象  2.调用文件方法进行操作  3.关闭文件

昨夜寒蛩不住鸣。
惊回千里梦,已三更。
起来独自绕阶行。
人悄悄,帘外月胧明。
白首为功名,旧山松竹老,阻归程。
欲将心事付瑶琴。
知音少,弦断有谁听。
小重山文件
f = open('小重山','r',encoding='utf-8')
data = f.read()
print(data)
f.close()

小结:

open 指打开同一目录下的文本文件

文件在 py3中是以 utf-8保存的,Windows系统中的默认编码是 gbk ,需要在 f = open('小重山')中加入 encoding='utf-8' 即 f = open('小重山',encoding='utf-8' )

文件的操作对象及为文件的句柄,本质上是文件对象,如: f = open('小重山','r',encoding='utf-8'),只有有句柄,才可以对文件进行操作

 

文件操作具体方法

基本操作  r (只可读)  w (只可写)  a (追加)

read

read括号内数字的含义

f = open('小重山','r',encoding='utf-8')
data = f.read(5)  #指5个字符
print(data)
f.close()

wirte

write在小重山文本成功写入hello world ,但是清空小重山文本之前的内容;

清空的动作从第一行的 "w" 开始的,如果没有对应文件会自动创建文件,有文件会自动清空文件,从第一个字符开始写。

f = open('小重山','w',encoding='utf-8')
f.write('hello world')
f.close()

 write连续写两次,输出结果顺序排列,无换行,无空格

f = open('小重山2','w',encoding='utf-8')
f.write('hello world')  #如需换行,需加\n
f.write('Chung')
f.close()
#hello worldChung

append

在原文件的基础上进行写入,是从光标的后面开始

f = open('小重山','a',encoding='utf-8')
f.write('\nhello world\n')  #如需换行,需加\n
f.write('Chung')
f.close()
# hello world
# Chung

扩展操作

readline

读取一整行,包括换行符 \n 

f = open('小重山','r',encoding='utf-8')
print(f.readline())  #打印一行,包括默认隐藏的换行符 \n
print(f.readline())  #到这共打印两行,包括默认隐藏的换行符 \n
f.close()
#昨夜寒蛩不住鸣。

#惊回千里梦,已三更。

readlines(不用readlines读文件,用 f )

读取整篇文章

f = open('小重山','r',encoding='utf-8')
print(f.readlines())  #默认打印所有行,字符串放在列表中
#['昨夜寒蛩不住鸣。\n', '惊回千里梦,已三更。\n', '起来独自绕阶行。\n', '人悄悄,帘外月胧明。\n', '白首为功名,旧山松竹老,阻归程。\n', '欲将心事付瑶琴。\n', '知音少,弦断有谁听。']
f.close()

通过readlines打印整篇文章

f = open('小重山','r',encoding='utf-8')
for i in f.readlines():
    print(i.strip())  #打印整篇文章,因为print自带换行,所有函数strip消除变量i即readlines读取的换行符
f.close()

通过readlines在指定语句后面加入句子

f = open('小重山','r',encoding='utf-8')
data=f.readlines()#注意及时关闭文件,只打开一次,节省时间
f.close()

number = 0
for i in data:
    number += 1

    if number == 6:
        i = ''.join([i.strip(), 'I like it.'])  # 取代万恶的+
    print(i.strip())
f.close()

 f 即用即取,节省内存(用此方法读取文件)

1 ##########对于大数据文件,要用以下方式(the best way):
2 f = open('小重山','r',encoding='utf-8')
3 number=0
4 for i in f:  #这是for内部将f对象做成一个迭代器,用一行取一行。
5     number+=1
6     if number == 6:
7         i = ''.join([i.strip(), 'I like it.'])  # 取代万恶的+
8     print(i.strip())

tell、seek

tell 表示当前光标的位置

seek 表示移动光标到指定位置

f = open('小重山','r',encoding='utf-8')

print(f.tell())#  取出光标位置   #tell识别中文时默认一个字占3个字符,英文时一个字母占一个字符
print(f.read(2))
print(f.tell())

f.seek(0)#  移动光标到指定的位置
print(f.read(4))

 

文件操作之flush及遍历文件最优法

flush实际应用

#flush():同步将数据从缓存转移到磁盘上去
#实例:可用作进度条
import sys,time
for i in range(30):
    sys.stdout.write("*")
    sys.stdout.flush()
    time.sleep(0.1)

print 的 flush

#print的flush
import sys,time
for i in range(30):
    print('*',end='',flush=True)
    time.sleep(0.1)

truncate:截断

f=open('小重山2','w',encoding='utf8')
#truncate():截断数据(不能在r模式下)
#在w模式下:先清空,再写,再截断
#在a模式下:直接将指定位置后的内容截断
f.truncate(5)
f.write('hello world')
f.truncate(5)
f.close()

r+, w+, a+

  • r+:(读写模式)光标默认在0位置,最后位置开始写
  • w+:(写读模式)先清空,再写读
  • a+:(从最后的位置开始读)光标默认在最后位置
f=open('小重山','r+',encoding='utf8')
print(f.tell())  #当前光标位置为0
print(f.readline())  #昨夜寒蛩不住鸣。
f.write('岳飞')  #《小重山》文件末尾处出现“岳飞”字样
print(f.tell())  #当前光标位置为228
f.seek(0)  #制定光标移动到0
print(f.readline())  #昨夜寒蛩不住鸣。
f.close() 

 

文件操作之修改磁盘文件

 常规思路(无法实现)

由于磁盘存储机制不能完成

f=open('小重山','r+',encoding='utf8')
number=0
for line in f:
    number+=1
    if number==3:
        f.write('Chung')  #此方法只能从文章末尾处开始添加

只能采取重新创建一个文件的思路

f_read=open('小重山','r',encoding='utf8')
f_write = open('小重山2','w',encoding='utf8')

number=0
for line in f_read:
    number+=1
    if number==5:
        line=''.join([line.strip(),'alex\n'])  #在句子后面继续添加字符
        # line='hello 岳飞\n'  #插入一行文字
    f_write.write(line)

f_read.close()
f_write.close()

 

文件操作之with方法

省略主动关闭文件操作

with open('log','r') as f:
        pass
 f=open('小重山', 'r')  #为保证数据储存不失误,需要输入f.close来结束
 f.readline()
 f.read()
 f.close()

 with open('小重山', 'r') as f:   #无需输入f.close,数据可直接正常储存
     f.readline()
     f.read()
 print('hello')

同时管理多个文件对象

with open('log1') as obj1, open('log2') as obj2:
    pass 
with open('小重山','r',encoding='utf8') as f_read, open('小重山2','w',encoding='utf8') as f_write:
    for line in f_read:
        f_write.write(line)
posted @ 2020-05-19 23:43  ChungZhao  阅读(173)  评论(0编辑  收藏  举报