python对文件的读取操作命令_3.python之文件操作

一、文件操作初识

f = open('文件路径', '编码方式', '操作方式')         #注意里面所有内容,需加引号 ”

打开一个文件需要知道的内容有:

文件路径:c:\文件.txt(绝对路径和相对路径)

编码方式:utf-8、gbk、GB2312…(windows 默认的编码方式gbk,linux默认的编码方式为utf-8)

操作方式:只读、只写、写读、读写、追加等

例如:打开一个已经存在的文件

f = open('c:\python\文件.txt',encoding='utf-8',mode='r')

content=f.read()print(content)

f.close()

执行输出:今天天气真好

代码解释:

f变量:可以命令为f_obj,file,f_handler... 这个变量,称之为文件句柄(句柄是操作系统在生成对象时分配给对象的唯一标识)

open命令:其实就是调用系统打开文件的动作。

f.close(): 关闭文件

操作文件流程:打开一个文件,产生一个文件句柄,对文件句柄进行操作,关闭文件

打开文件时的报错原因:

1、UnicodeDecodeError:编码不一致,存储文件编码与打开文件时的编码方式不同

2、FileNotFoundError或[Error 22] Invalid argument: '\u202adD:\\xx.txt':路径问题(文件名错误)

解决方式:

1.将每个\变成 \\,比如 D:\\xx.txt

2.前面加r ,比如 r'D:\xx.txt'

二、文件的读、写、追加

1、文件的读:

r    *****

rb   ***

r+ *****

r+b

(1) r:对于r模式,mode可以不写

f=open('c:\python\文件',encoding='utf-8',mode='r')

content=f.read()print(content)

f.close()

(2) rb:文件以字节(8bit,16进制)进行读取。不需要编码方式。主要用于非文字类的文件读取。

f=open('c:\python\图片.jpg',mode='rb')print(f.read())

f.close

输出结果是:b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x0…….

(3) r+:读写,先读后追加。

r+ 一定要先读后写,否则会错乱或者读取不到内容

先读后写:在文件后追加上写的内容

path='c:\python\文件.txt'f=open(path,encoding='utf-8',mode='r+')

content=f.read()                 #先读

print(content)

f.write('天安门')                   #后追加

f.close()

不读直接写:写的内容会从文件开始覆盖原文件(按照每个不同字符的字节的大小)

path='c:\python\文件.txt'f=open(path,encoding='utf-8',mode='r+')

f.write('天安门')

f.close()

先写后读,不可取

f = open('log.txt',encoding='utf-8',mode='r+')

f.write('BBB')

content=f.read()print(content)

f.close()

执行输出,内容是空的。为什么呢?因为光标,默认是从0开始。只要进行一个动作,光标就会移动,包括读取。上面的代码写入时,光标移动到最后了。所以执行f.read()时,读取不到后面的内容了。

(4)r+b:文件以字节形式进行先读后以字节形式写,没有encoding。

path='c:\python\文件.txt'f=open(path,mode='r+b')print(f.read())

f.write(b'\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8')

2、文件的写

w

wb

w+

w+b

(1)w:没有文件,创建文件;有文件,文件先清空,后写入

f=open('文件',encoding='utf-8',mode='w') #在相对路径下先创建这个文件

f.write('你好,我是summer')

f.close()

(2)wb:以bytes写入,写入的内容,必须要转换为bytes类型才可以

f=open('文件',mode='wb')

f.write(b'\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8')

f= open('log.txt',mode='wb')

f.write('人生苦短,我想学Python'.encode(encoding="utf-8"))

f.close()

(3)w+:写读,先写后读,但是此时光标已经移至最后,读出的内容可能只有一个换行符。但是可以通过改变光标位置进行读操作

f = open('log.txt',encoding='utf-8',mode='w+')

f.write('AAA')print(f.tell()) #按直接去读光标位置

f.seek(0)     #调整光标位置

content =f.read()print(content)

f.close()

执行输出:3AAA

ftp的断点续传,需要用到光标,一定会用到tell和seek

(4)w+b:以字节方式写入加读取

3、文件的追加

a

ab

a+

a+b

a:没有文件,创建文件追加;有文件,在文件后面追加

f=open('文件追加',encoding='utf-8',mode='a')

f.seek(1) #不管光标在哪里,都是在最后追加

f.write('123')

三、文件的改

文件的改(需要用到python的内置函数 os)

1、以读的模式打开原文件,产生一个文件句柄f1;

2、以写的模式创建一个新的文件,产生一个文件句柄f2;

3、读取原文件的内容,进行修改,并将修改后的写入到新文件中;

4、将原文件删除;

5、将新文件重新命名为原文件

方法一

importos

with open('maitian.csv',encoding='utf-8',mode='r')as f1,\

open('maitian2.csv',encoding='utf-8',mode='w')as f2:

old_content=f1.read()

new_content=old_content.replace('标题','biaoti')

f2.write(new_content)

os.remove('maitian.csv')

os.rename('maitian2.csv','maitian.csv')

方法二

importos

with open('maitian.csv',encoding='utf-8',mode='r')as f1,\

open('maitian2.csv',encoding='utf-8',mode='w')as f2:for line inf1:

new_line=line.replace('biaoti','标题')

f2.write(new_line)

os.remove('maitian.csv')

os.rename('maitian2.csv','maitian.csv')

四、文件读取的五种方式

r模式有5种模式读取

第一种:全部读取出来 f.read()。全部读取,对于较大的文件,内存会负担不起

f = open('天气.txt',encoding='utf-8')

content=f.read()print(content)

f.close()

第二种:一行一行的读 f.readline()。按行读取,但是中间会有个换行符,这是因为每行文件末尾默认都有一个换行符

f = open('天气.txt',encoding='utf-8')print(f.readline())print(f.readline())print(f.readline())

f.close()

第三种:f.readlines()按行读取,返回一个列表,列表中的每个元素就是每一行的字符串

f = open('天气.txt',encoding='utf-8')print(f.readlines())

f.close()

执行输出:

['03月27日(今天)\n', '晴转多云\n', '11~27℃\n', '西南风 1级\n', '重度污染']

第四种:读取一部分f.read(n)。在r模式下,read(n) 按照字符去读取。rb模式下按照字符的bytes模式读取

f = open('天气.txt',encoding='utf-8')print(f.read(3))

f.close()

执行输出:

03月 # 表示3个字符

第五种:for循环读取

f = open('天气.txt',encoding='utf-8')for line inf:print(i.strip())

f.close()

执行输出:

03月27日(今天)

晴转多云

11~27℃

西南风 1级

重度污染

在for循环中,每次读取一行,结束之后,内存就释放了。所以在整个for循环个过程中,始终只占用了一行内容的内存。推荐使用第5种方式。

五、文件的常用操作方法

read():文件的读操作

write():文件的写操作

close():文件关闭

seek():移动光标位置,在w+或者a+的时候可以通过移动光标的位置进行读取,光标是按照字节来移动

seek(0,2):将光标移到最后一位

tell():返回光标的位置

readable():判断是否可读

writable():判断是否可写

f = open('log.txt',encoding='utf-8',mode='r+')print(f.writable())

f.close()

执行输出:True

truncate():在writable模式下进行截取文件,所以文件的打开方式必须可写r+、a+,不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果

f = open('log.txt',encoding='utf-8',mode='r+')#截取3个字节

f.truncate(3)

content=f.read()print(content)

f.close()

执行输出:中

六、主动关闭文件句柄的方法

有的时候会忘记在末尾加上f.close(),所以有主动关闭文件句柄的方法,这种方法会在一定时间内关闭,有利有弊,为了避免忘记回收文件句柄,需要使用with open方法,代码执行完毕之后,自动关闭文件句柄

功能1:自动关闭文件句柄

with open('log.txt',encoding='utf-8') as f:print(f.read())

功能2:一次性操作多个文件

with open('文件',encoding='utf-8',mode='r') as f1,\

open('文件1',encoding='utf-8',mode='w') as f2:print(f1.read())

f2.write('qwert')

有些情况下,必须先关闭,才能执行某动作的情况下,不能用with,这种情况比较少见。

所有的软件,不是直接在原文件修改的。它是进行了5步操作:

1.将原文件读取到内存。

2.在内存中进行修改,形成新的内容。

3.将新的字符串写入新文件。

4.将原文件删除。

5.将新文件重命名成原文件。

题目:将log文件内容中含有summer的,替换为spring

importos

with open('log',encoding='utf-8') as f1,\

open('log.bak',encoding='utf-8',mode='w') as f2:

content=f1.read()

new_content= content.replace('summer','spring')

f2.write(new_content)

os.remove('log')

os.rename('log.bak','log')

这种方法,不好。如果文件比较大,内存直接爆掉。因为f1.read()是将文件所有内容写入内存中。

推荐做法:

importos

with open('log',encoding='utf-8') as f1,\

open('log.bak',encoding='utf-8',mode='w') as f2:for i inf1:

new_i= i.replace('summer', 'spring')

f2.write(new_i)

os.remove('log')

os.rename('log.bak','log')

这种方式,每次只占用一行。所有软件,都是执行这5步的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值