文件是一个十分重要的操作,在linux中有句话叫万物皆文件。这个就反应了文件的重要性,在python中文件的操作也是十分重要的。那么如何打开文件并读取文件的呢?这里是用是一个特殊语法。首先需要申请一个句柄,句柄也可以说是指针就是一个指向文件对象的指针。那么是如何定义的呢?

  

f = open('沁园春', 'r', encoding='utf8') 

  这个是一个简单的句柄,它的组成可以看成是f也就是保存句柄的变量,open函数也就是打开后面的文件。在第一个参数中也就是文件的名字,这可以用绝对路径也可以用相对路径,为了方便这里直接绝对路径,并定义在本程序向同级的目录下。第二个参数也就是read模式也就是能够读取文件,相对的来说也就无法再文件中写入文件了。第三个是编码格式,在python中是默认的utf-8这里就是啦。

  然后有了这样一个句柄该怎么操作呢,这里就是f变量,或者说一个句柄对象它的函数有哪些呢。这里简单的提到一些,首先是f.read()函数,这个函数就是读取字符,并返回。

date = f.read(22)  
print(date)

  里面的参数是读取字符串的长度,默认是一个。可以自己添加,在这里又要提到字符的编码啦。在python中是占用三位的,字母就是占用1位的。

   在使用完句柄后一定要关闭,关闭也就是f.close,虽然python是会帮我们自动关闭的,但是自己掌控肯定是更好的。

f.close()  # 一定需要关闭

  然后就是写模式了,这里与读模式基本类似,但是就是将句柄中的r改成w 

f = open('沁园春', 'w', encoding='utf8')

  写模式有一个特点的,写不是在文件的最后进行写,而是在文件的最末尾。这种性质等下还会提到。 

f.write('hello world')

  为了使能够在文件的最后添加,而不是将其中的内容覆盖再写,我们使用的是a模式也就是append追加模式,在这种模式下我们就能够将文件的内容写在最后面啦..

f = open('沁园春2', 'a', encoding='utf8') 
f.write('\nand you?')
f.write('\n hello kit')
f.close()

 对于句柄还有其他的函数,这里常用的有readline(),reeadlines(),seek(),tell(),truncate()等

# _author:"Isaac_hu"
# data: 2018/3/5

# f = open('沁园春', 'a', encoding='utf8')  # windows自带是gbk编码,要改为utf-8
# print(f.readline())  # 句柄 可以看成是指针,它在做操作后就会不断将指针移动到下一个位置
# print(f.readline())

# print(f.readlines())  # 将所有的内容分成列表,里面有所有行的字符串,这个会很占内存
# data = f.readlines()  # 这样可以节省使用这个打开文件是时间
# f.close()
# for i in data:  # 若过读完了,那么就不能再进入循环了。所以要注释掉上面的
#     if i == data[5]:
#         i = ''.join([data[5].strip(), 'I like it'])
#     print(i.strip())  # 用于去掉字符串中的换行

# for i in f:  # 这里是for内部,将f对象做成迭代器,用一行去一行
#     # 若是readlines是将读取的值直接copy到内存中,但是是迭代器的时候,只会调用你要用的内容到内存中
#     print(i.strip())
# f.close()
# f.read(4)
# print(f.tell())  # 用于指示指针,在的位置。英文是一个单词就是字符,汉字一个字就是三个字符
#
#
# f.seek(0)  # 调整光标的位置。
# print(f.read(4))
# f.close()
# import sys, time
# for i in range(30):
#     sys.stdout.write("*")  # flush 是用于从缓存区写到文件中
#     sys.stdout.flush()  # == print("*",end = '',flush = True)
#     time.sleep(0.2)
# f.truncate(6)  # 默认是在最开始的位置截断,w环境下意义不大,在a下才有意义
# f.close()

# r+ , w+ , a+
# f = open('沁园春', 'r+', encoding='utf8')  # 读写模式
# print(f.read())
# f.write('毛主席')  # 这样会直接跟在文件的最后面
# f.close()

# f = open('沁园春', 'w+', encoding='utf8')  # 写读模式
# f.write('毛主席')  # 在写后会将光标移动到写的最后
# f.seek(0)  # 要将光标移动到最前面才能读取到
# print(f.readline())
# print(f.tell())
# f.close()

f = open('沁园春', 'a+', encoding='utf8')  # 追加读
f.write('毛主席')  # 本来就在最后面,写也是写在最后面
f.seek(0)  # 要将光标移动到最前面才能读取到内容
print(f.readline())
print(f.tell())
f.close()

  还有一个问题,也就是如何解决在指定行添加内容的问题,这里的解决方法是覆盖文件:

# _author:"Isaac_hu"
# data: 2018/3/5

f = open('沁园春', 'r', encoding='utf8')
f1 = open('沁园春1', 'a', encoding='utf8')
number = 0
for line in f:
    number += 1
    if number == 6:
        line = ''.join([line.strip(), 'hello isaac\n'])
    f1.write(line)
f1.close()
f.close()
# 应为在磁盘中的位置已经写死了,因此write一直会在最后,所以只能添加一个新的文件,重新写这个文件,只能覆盖,不能修改