python--文件操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python--文件操作相关的知识,希望对你有一定的参考价值。
文件操作分三部分:
1,打开文件
2:操作文件
3,关闭文件
读取文件:
要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符:
例如:
f = open("./myfile.txt","r")#第一个参数是要操作的文件,第二个是操作的方式 r 代表读
参数说明:
name : 一个包含了你要访问的文件名称的字符串值。
mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
关于open()的mode参数:
'r':读
'w':写
'a':追加
'r+' == r+w(可读可写,文件若不存在就报错(IOError))
'w+' == w+r(可读可写,文件若不存在就创建)
'a+' ==a+r(可追加可写,文件若不存在就创建)
对应的,如果是二进制文件,就都加一个b:
'rb' 'wb' 'ab' 'rb+' 'wb+' 'ab+'
详细说明:
read : read是逐字符地读取,read可以指定参数,设定需要读取多少字符,默认读取整个文件
readline : readline只能读取第一行代码,原理是读取到第一个换行符就停止。
readlines : 读取整个文件到一个迭代器以供我们遍历(读取到一个list中,以供使用,比较方便)
文件的读取:
read:
f = open("./1.txt","r")
f_read = f.read(60)#read是逐字符地读取,read可以指定参数,设定需要读取多少字符,默认读取整个文件
print(f_read)
print(f_read)#关闭文件
f = open("1.txt")#默认不见参数是以只读的形式来读取
f = open("1.txt")
print(f)#输出文件名,打开模式,编码cp936是GBK编码
print(f.read(10))#读取指定的大小,默认是全部读取,文件大时比较耗费内存不推荐
print(f.mode)#查看文件的打开模式
print(f.encoding)#查看文件的编码
在ubuntu下:
ubuntu下的编码为UTF-8,文件是GBK所以要改下编码
f = open("1.txt",encoding="GBK")
这样windows和linux都显示正常
windows 下
ubuntu下:
注意:在打开文件时可以使用f.encoding查看编码,后面加上编码方式这样就不会出现乱码的问题
type(f)函数可以查看类型
打开不存在的文件会报错
如果改为写就会创建一个新的文件
上面的代码多次执行不会在2.txt中新增内容,w模式会把里面的内容清空后写入新的内容
改成a模式会不断追加写入:
f = open("2.txt",'a',encoding="GBK")#文件不存在会自动创建
print(f)
f.write("hello world")#写入文件内容
f.close()#关闭文件
file = open('2.txt','r')
print(file.read())#读取刚写的内容
file.close()
使用二进制读取:
file = open('2.txt','rb')
print(file.read())#读取刚写的内容
file.close()
关于CP936:
CP936和UTF-8本身和Python没有任何关系。
CP936其实就是GBK,IBM在发明Code Page的时候将GBK放在第936页,所以叫CP936。
readline:
f = open('1.txt','r')
f_readline = f.readline() #readline只能读取第一行代码,原理是读取到第一个换行符就停止。
print(f_readline)
print("-------------------------------------")
#如果读取多行用循环来读
for i in range(1,10):
print(f.readline())
f.close()
不提倡使用这种方式读文件
readlines:
f = open(r"1.txt",'r')
fres = f.readlines()#读取整个文件到一个列表以供我们遍历(读取到一个list中,以供使用,比较方便)
print(fres)
f.close()
循环读取
f = open(r"1.txt",'r')
fres = f.readlines()#读取整个文件到一个迭代器以供我们遍历(读取到一个list中,以供使用,比较方便)
print(fres)
for i in fres:
print(i)
f.close()
f = open("1.txt","r",encoding='gbk')#第三个参数用什么编码打开
如果文件是GBK编码,使用UTF-8编码打开会报错
f = open("1.txt","r",encoding='utf-8')
print(f.read())
注意:文件编码和代码的编码方式是两个不同的概念,一个是操作的文件,另一个是写代码工具的编码
写文件:
w模式在进行操作前,文件中所有内容会被清空。比如在file1中写入'hello world',程序执行后file1中就只剩下一句'hello world'
f = open('file1','w',encoding='utf8') #写入的时候指定编码,读取的时候不容易出现乱码,读取的时候也要根据写入的编码读取
f_w = f.write('hello world,世界你好')
print(f_w) #有意思的是,这里并不打印'hello world,世界你好',只打印写入多少字符
f.close()
如果不指定编码容易出现乱码
写入文件的过程为党调用write函数时 ,解释器将内容写到文件缓存区,缓存区如果满了就写到磁盘里,没满的时候保存到缓存区,所以有时候写文件不能及时获取写入的内容就是这个原因,当调用close()函数时不管满不满都写到磁盘里,还有一个是flush()函数,强制把缓存写到磁盘里
a模式与w模式不同的是,a模式不会把原来内容清空,而是光标移到内容最后位置,继续写入新内容。比如在最后追加'hello world'
f = open('file1','a',encoding='utf8')
f_w = f.write('hello world,世界你好')
print(f_w)
f.close()
在r模式时,用for循环和readlines()输出文件内容,这种输出内容的原理是:打开文件,把全部内容读入内存,然后再打印输入,当文件很大时,这种读取方式就不靠谱了,甚至会使机器崩溃。所以需要及时关闭文件,如下:
f = open('file','r')
data=f.readlines() #注意及时关闭文件
f.close()
for i in data:
print(i.strip())
#查询文件中光标位置
f = open('file1','r')
print(f.tell()) #光标默认在起始位置
f.seek(10) #把光标定位到第10个字符之后
print(f.tell()) #输出10
f.close()
f = open('file','w')
print(f.tell()) #先清空内容,光标回到0位置
f.seek(10)
print(f.tell())
f.close()
当我们在写入list列表时会报错
这就需要将list转为字符串
因为python的read和write方法的操作对象都是string。而操作二进制的时候会把string转换成list进行解析,解析后重新写入文件的时候,还得转换成string。
str = 'abcde'
list = list(str)
list
['a', 'b', 'c', 'd', 'e']
str
'abcde'
str_convert = ''.join(list)
str_convert
'abcde'
关闭文件:
python文件指针:
使用w+后清空文件
指针移动到开始位置0
import os
f = open("2.txt",'w+')
print(f.tell())
如果要设置文件位置用seek(0,os.SEEK_SET)
import os
f = open("2.txt",'r+')
print(f.tell())
f.read(3)
print(f.tell())
f.seek(0,os.SEEK_SET)
print(f.tell())
移动到结尾:
seek(0,os.SEEK_END)
还有些细节没写到,以后慢慢补上。
以上是关于python--文件操作的主要内容,如果未能解决你的问题,请参考以下文章