#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2017/11/18 13:04
# @Author : mixiu26
# 打开当前项目路径下的xx文件:
open("yesterday")
# 打开文件并读取, 现在先携带编码集:
# data = open("yesterday",encoding="utf-8").read()
# print(data)
# 获取文件对象: ---- >> 获取文件操作权: 从而用对象去对文件进行操作:
f = open("yesterday",encoding="utf-8") # f 就相当于文件句柄
print(f.read())
data2 = f.read()
print("data2 ------------------------",data2) # 文件读取一次就没有了,因为上次读取文件已经到达最后一行,再往后就没有内容,
#所以在想要读取一次文件必须要让光标重新回到初始位置才能继续往下读
f1 = open("yesterday2","w",encoding="utf-8") # 创建文件句柄时,需要指定读或写的模式,如果没有指定则默认"r"读取模式,指定句柄模式后
# 只能按照指定的方式来进行操作,既: 设定了读就是读,写就是写,不能在读句柄中操作写文件,亦不能在写句柄中操作读文件,'a' --- >>追加写入的意思,同样不能读
# 注意问题: 以写句柄打开文件,相当于新建一个文件, 所以如果之前有同名文件,这个文件就会被覆盖,所以在用写句柄进行操作时,一定要注意,新文件不要和其他文件重名。
f1.write("我多么想与你,有一秒专属的剧情
")
f1.write("如果你愿意一层一层的剥开我的心
你会鼻酸,你会有流泪
只要你能听到我,看到我的全心全意...
")
# 将写模式的句柄改为追加写模式
f1 = open("yesterday2","a",encoding="utf-8") # a ---- >>追加写入, a = apend: 在末尾追加
f1.write("你会鼻酸,你会有流泪
只要你能听到我,看到我的全心全意...")
print("===============================")
# 将追加写入方式改为read模式: 以列表的形式按行读取出所有的文件内容:
f1 = open("yesterday","r",encoding="utf-8")
# data5 = f1.readlines()
# print(data5)
# 读取前五行:
# for i in range (5):
# print(f1.readline()) # readline() ---- >>一行一行读取
# 打印文件,第十行位置输出"你会鼻酸,你会有流泪, 只要你能听到我,看到我的全心全意..."
count = 0
for line in f1: # 每一行就是一个元素: 用行的形式读取完所有内容,然后放置在一个列表里
if count == 9: # 因为i是元素,所以你不能拿i来判断是不是=9
print("你会鼻酸,你会有流泪, 只要你能听到我,看到我的全心全意...")
count += 1
continue # 跳出本次循环
print(line.strip())
count += 1
#方法二: 两种方法都是正确的
for index, line in enumerate(f1.readlines()):
if index ==9:
print("你会鼻酸,你会有流泪, 只要你能听到我,看到我的全心全意...")
continue
print(line.strip())
# 读取文件光标位置: tell() ---- >>tell()记录的是所有的字符个数,包括了空格和文件里的字符:
f2 = open("yesterday3","r",encoding="utf-8")
print(f2.tell()) # 文件光标初始位置:0
# 读取5个字符后查看tell()
print(f2.readline(5)) # Someh
print(f2.tell()) # 5 ----- >> 由此可见,tell()记录的是字符个数来做自己的位置
# 如果readline(x) 读取字符,那么我们就会无法知晓一行什么时候结束,所以呢,我们就使用readline()
for i in range(3):
print(f2.readline().strip())
print(f2.tell()) # 168 ,那么我们读取以后要怎么退回去呢?
# seek(): 光标退回,因为我们现在不知道在哪个位置,所以我们就让他回到初始位置:
f2.seek(0) # seek(0) 表示返回到0个字符处,下次打印则从此处开始 seek(10) --- >> 就表示,下次从第十个字符开始读取
print("+++++++++++++++++++++++++++++++")
# 退回后再次读取:
for i in range(3):
print(f2.readline().strip())
print(f2.tell())
print(f2.encoding) # 打印文件编码: utf-8
print(f2.flush()) # 强制刷新
# f4 = open("yesterday","a",encoding="utf-8")
# truncate() ------ >> 截断,不带参数表示清除所有文件内容,带参数,表示从参数位置开始清除文件内容
# f4.truncate(10) # ------- >> 清空文件10个字符后的所有内容 Somehow, i ---- >> 之后的内容都被清除
# f4.seek(10) # ----- >> 跳到字符10的位置
# f4.truncate(20) # Somehow, it seems th 不论seek到哪里,truncate()都从头开始截取要保存的字符
# 文件修改: 读写模式: r+
# 打印三行文件,写入一行,在打印一行:
f5 = open("yesterday","r+", encoding="utf-8")
f5.seek(0)
for lin in range(3):
print((f5.readline()).strip())
f5.write("good====================")
print((f5.readline()).strip())
# 写读模式 : 他是新创建一个文件,然后开始写,所以没有东西可读,那么我们可以先写几行然后再去读取
f6 = open("yesterday","w+", encoding="utf-8")
f6.write("good====================
")
f6.write("good====================
")
f6.write("good====================
")
f6.write("good====================
")
# 打印光标:
print(f6.tell())
# 回答字符10的位置,继续写入:
f6.seek(10)
print(f6.tell())
# 开始读取:
print(f6.readline())
# 继续写入:
f6.write("==should be at second line==") # 前面读取了一行,实际上只能追加到最后一行
f.close()
f1.close()
f2.close()
# f4.flush()
f6.flush()