# __author__:Nzkalhbxx
# __date__:2017/10/17
import sys, time
file = open("citys.txt", "r", encoding="utf8")
print("readline, readlines方法".center(37, "-"))
# readline(self, *args, **kwargs): 读取文件的一行数据放入内存
print(type(file.readline()))
print("".join(["readline: ", file.readline()]))
print("".join(["readline: ", file.readline()]))
""" 打印结果可以发现, 两个打印之间有一个有一行空行, 原因是文件一行的末尾有一个换行, 而print默认也会换行输出,
因此就多了空余的一行"""
# readlines(self, hint=-1): 读取并返回一个列表, 列表元素为文本的一行数据
print(type(file.readlines()))
# 由于readlines一次性将数据读取完, 并默认将读取的数据以行为单位返回一个列表
file.seek(0)
lineList = file.readlines()
print(lineList)
for i, line in enumerate(lineList, 1):
# 由于每行有一个换行加之print默认也有一个换行, 所以使用strip()将取出的每一行数据的首尾两端的空格/换行去掉
print("".join([str(i), ": ", line.strip()]))
# 使用readline()和readline()的弊端在于, 会将数据从外存中全部读入内存, 如果数据文件过于庞大, 必然导致程序内存吃紧, 非上上之选
print("读取数据文件时使用for文件对象的方法".center(37, "-"))
# python在对指针位置进行标志时, 不是按字符个数记录指针位移, 而是按字符所占的字节个数依次递增记录位置, 并由0开始标志, 左闭右开
print("".join(["当前文件指针的指向: ", str(file.tell())]))
print("".join(["设置文件指针的位置为: ", str(file.seek(0))]))
""" 直接对文件对象for循环, 由于file是一个文件对象, 不可迭代, 因此Python在对文件对象进行for遍历时, 会将文件对象转化为一个迭代器,
该迭代器默认每次从数据中读取一行数据, 相对于readlines()的好处时, 使用对文件对象迭代的方法不会一次性将数据全部读取内存,
而是在需要时才将数据从外存中读入内存, 以便使用, 因此推荐优先使用for文件对象而非将文件对象readlines()为一个列表再对列表进行迭代 """
# 对文件迭代和使用readlines(), readline()时的指针是同一个指针, 即一个对象readline, readlines和对文件本身的迭代使用的读指针是同一个
for data in file:
print(data.strip())
print("tell()方法和seek()方法".center(37, "-"))
# seek()函数用于设置文件对象的读写指针位置, 指针的位置由0开始, 指针位置的变化由读写操作或seek()方法设置, 其值以字节数为单位计算
print("".join(["file指针当前的位置: ", str(file.tell())]))
# 设置文件对象指针的所指位置:
position = file.seek(120)
print("".join(["设置完之后文件对象指针的位置: ", str(position)]))
print("flush()方法".center(37, "-"))
# 由于对文件进行write()操作时, 会先将数据存储在缓冲区, 等文件对象close或者缓冲区满了以后才会写入磁盘, 而有时,
# 我们又需要实时地写入磁盘或者为了防止断电造成数据为写入的事情发生, 便需要用到flush()函数, 该方法允许用户自定义写入磁盘的时间
num = 0
while num < 33:
# 输出到屏幕也是数据的写操作
print("->", end="", flush=True)
num += 1
time.sleep(0.3)
运行结果
网友评论