文件操作
fp = open("test.txt",w) 直接打开一个文件,如果文件不存在则创建文件
## 形式一: with open("test.txt","w") as fp: print(pf.write())
##这里就不需要加 fp.close()了,自动会关闭的。
## 形式二:
fp = open("test.txt","w") print(fp.write())
pf.close() ##注意:一定要手动关闭,不然内存资源会一直被占用
- 读模式
r 只读模式,必须打开一个已有的文件,且只能执行读操作。
r+ 读+追加模式,可读可写,与‘r’相同之处在于也是必须打开一个已有的文件,不同的是它可写可读,而且写与读不分先后,即随时都可进行读与写。(写为追加在文件末尾)
读模式的功能:
##################################### r模式代码实现
fp = open('test','r',encoding='utf8') print(fp.read(1)) ##size为一个字节的单位 print(fp.tell()) ## 当前指针的位置 print(fp.readline())
print(fp.readlines(1)) ## 返回的是一个列表,列表里的一个元素代表一行
########################### 运行结果:
1 #这 2 #3 3 #是一个test文件0
4 #['这是一个test文件1 ']
########################################## r+模式代码实现
fp = open('test','r+',encoding='utf8')
fp.write('这是新加write ') ## 这里write会写在末尾 print(fp.readline()) print(fp.tell()) fp.write('新加进去的 ') ## write会在末尾追加 print(fp.read()) ## 这里指针会放在最后面
1 ################ 运行结果: 2 #这是一个test文件2 3 # 4 #25
- 写模式
w 只写模式,打开即默认创建一个新的空文件,当然若打开的是已有文件,则清空文件,且只能执行写操作。
w+ 写读模式,打开创建新文件,因此需要先把内容写进去在读。即保证文件有内容通过移动光标来读自己想要的部分。
########### w模式:
fp = open('test','w',encoding='utf8')
fp.write('这是一个新建的write文件 ') ## write会覆盖原有内容
fp.writelines(['writeline%d '%i for i in range(10)]) 写入一个列表
######### w+模式: fp = open('test','w+',encoding='utf8') print(fp.readline()) ## 运行结果为空,当用r或者r+模式代开一个文件时,会将这个文件的内容清空 fp.write('这是一个新建的write文件 ') print(fp.read()) ## 运行结果为空,指针放在上一次写入的位置
- 追加模式
a 追加模式,若打开的是已有文件则直接对已有文件操作,若打开文件不存在则创建新文件,只能执行写(追加在后面),不能读。即追加写。
a+ 追加读写模式,打开文件方式同‘a’一样,写方式也和'a'一样,但是可以读。且是任意时刻读写。需要注意的是你若刚用‘a+’打开一个文件,则不能立即读,因为此时光标已经是文件末尾,除非你把光标移动到初始位置或任意非末尾的位置。
########### a模式: fp = open('test','a',encoding='utf8') fp.write('这是一个新建的a.write()文件') ## 和w模式的区别在于:a模式会追加到文件末尾,不会覆盖文件的内容 print(fp.read()) ## 这里会报错,a模式只能写不能读
########## a+模式: fp = open('test','a+',encoding='utf8') print(fp.read()) ## 用a+打开一个文件,会默认将指针放在末尾,所以这里打印为空 fp.seek(0) print(fp.readline()) fp.write(' 这是一个a+.write()文件 ')
- b模式
rb 以二进制读模式打开
wb 以二进制写模式打开 (参见 w )
ab 以二进制追加模式打开 (参见 a )
rb+ 以二进制读写模式打开 (参见 r+ )
wb+ 以二进制读写模式打开 (参见 w+ )
ab+ 以二进制读写模式打开 (参见 a+ )
############# b模式: fp = open('test','rb') print(fp.readline())
######### 运行结果: b'xe8xbfx99xe6x98xafxe4xb8x80xe4xb8xaaxe6x96xb0xe5xbbxbaxe7x9ax84writexe6x96x87xe4xbbxb6 ' ### 打印出的结果是一个二进制
- 常用的函数
fp.read([size]) size为读取的长度,以byte为单位
fp.readline([size]) 读一行,如果定义了size,有可能返回的只是一行的一部分
fp.readlines([size]) 把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。
fp.write(str) #把str写到文件中,write()并不会在str后加上一个换行符
fp.writelines(seq) #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。
fp.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError
fp.flush() #把缓冲区的内容写入硬盘
fp.fileno() #返回一个长整型的”文件标签“
fp.isatty() #文件是否是一个终端设备文件(unix系统中的)
fp.tell() #返回文件操作标记的当前位置,以文件的开头为原点
fp.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。
fp.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。
fp.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。