python--文件操作,,文件操作分三部分:1


文件操作分三部分:

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--文件操作

评论关闭