文件是一个十分重要的操作,在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(' and you?') f.write(' 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 ']) f1.write(line) f1.close() f.close() # 应为在磁盘中的位置已经写死了,因此write一直会在最后,所以只能添加一个新的文件,重新写这个文件,只能覆盖,不能修改