python修改文件名正则_Python文件操作(文件,正则)

Python文件操作(文件,正则)

文件:

文件操作

文件编码

打开文件的几种模式

操作文件的方法

文件内光标的移动

文件的修改

正则:

一、文件的操作

1.文件的介绍:

计算机系统分为:计算机 硬件、操作系统、应用程序三部分;

无论使用python还是其他语言若想要把数据永久的保存下来,必须要将存在内存中的数据刷新到硬盘中,这就涉及到应用程序要操作硬件;我们知道,应用程序是不能直接操作硬件的,只能通过操作系统来调用硬件,操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序老操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。

2.操作文件的流程:

有了文件的概念,我们无需在去考虑操作硬盘的细节,只需要关注操作文件的流程:

1 1.打开文件,得到文件句柄并赋值给一个变量;

2 2.通过文件句柄对文件进行一系列的操作;

3 3.关闭文件;

3.在python中的表示:

48304ba5e6f9fe08f3fa1abda7d326ab.png

#1.打开文件,得到文件句柄并赋值给一个变量;

f = open("python.txt","r",encoding="utf-8")

## 注意,默认打开模式就是r只读模式;

#2.通过文件句柄对文件进行操作:

date = f.read()

#3.关闭文件

f.close()

48304ba5e6f9fe08f3fa1abda7d326ab.png

4.“f = open("python.txt","r",encoding="utf-8")”的过程分析

#1.由应用程序向操作系统发起系统调用open(...)

#2.操作系统打开该文件,并返回一个文件句柄给应用程序

#3.应用程序将文件句柄复制给变量f

5.关于文件操作需要注意的地方,关于文件操作需要注意的地方,关于文件操作需要注意的地方,重要的事敲三遍;

48304ba5e6f9fe08f3fa1abda7d326ab.png

#强调第一点:

打开一个文件包含两部分资源:操作系统级打开的文件 + 应用程序的变量;在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落的回收;

回收方法:

1.f.close() #回收操作系统级打开的文件;

2.del f #回收应用程序级的变量;

其中 del f 一定要发生在f.close() 之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源;而python自动的垃圾回收机制决定了我们无需考虑 del f ,这就要求我们在操作完毕文件后,一定要记得 f.close()

还有一种方法,不用我们去考虑f.close()问题,那就是使用with关键字来帮我们管理上下文:

with open('a.txt','w') as f:

pass

with open('a.txt','r') as read_f,open('b.txt','w') as write_f:

data=read_f.read()

write_f.write(data)

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

#强调第二点:

f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。

48304ba5e6f9fe08f3fa1abda7d326ab.png

6.py2和py3中的file和open:

首先在python3中操作文件只有一种选择,那就是open();

而在python2中则有两种方式:file()与open();

两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,而用open()打开文件,是用python的内建函数来操作,我们一般使用open()打开文件进行操作,而用file当做一个类型,比如type(f) is file;

7.文件路径:

绝对路径:从硬盘的根目录开始查找,或者从互联网上寻找一个路径;

相对路径:相对于当前程序所在的文件夹

二、文件编码

上面提过,重要的事在说一遍;

f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。

三、打开文件的几种模式

语法:文件句柄(变量) = open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

模式mode:

48304ba5e6f9fe08f3fa1abda7d326ab.png

#1.打开文件的模式有(默认为文本模式):

模式 说明

r 只读模式,也是默认模式,文件必须存在,不存在则跑出异常;

w 只写模式,不可读;不存在则创建,存在的话如果有进行写入动作则清空文件内容并写入新内容,如果没有写入动作则只打开不清空文件;

a 只追加模式,不可读,不存在则创建,存在则只在末尾追加内容;

#例子:

对"python.txt"这个文件里的内容进行读取;

[root@wolaixunshan ~]# echo "人生苦短,python当歌" > /tmp/python.txt

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

#Author:zjk

#mail:zjkmmd@163.com

#Time:2018-08-06 15:05:32

#Name:py1.py

#Version:V1.0

#Description:This is a script.

f = open("/tmp/python.txt","r",encoding="utf-8")

date = f.read()

print(date)

f.close()

[root@wolaixunshan ~]# python3 py1.py

人生苦短,python当歌

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

#2.对于非文本文件,只能使用b模式打开,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、

图片文件的jpg格式、视频文件的avi格式)

模式 说明

rb 只读模式,文件必须存在,不存在则抛出异常;

wb 只写模式,不存在则创建,存在的话如果有写操作则清空文件内容并将写操作数据加入进行,没有写操作的话则不清空文件;

ab 只追加模式,不可读,不存在则创建,存在则只追加内容;

注意:以b方式打开时,读取到的内容是字节类型,写入时也许要提供字节类型,不能指定编码;

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

#3."+"模式,就是增加了一个功能;

模式 说明

r+ 读写(可读,可写)

w+ 写读(可写,可读)

a+ 写读(可写,可读)

注意:

1.r+模式:

读写模式,先读后写;这里需要注意的时,在r+模式中无论读取了多少内容,光标在哪里,写入的时候都是在结尾写入的,除非上来就写入,

这时的写入是写在文件开头的

例如:

使用r+模式先读取3个字符内容,然后进行数据添加;

[root@wolaixunshan ~]# cat /tmp/python.txt

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

#Author:zjk

#mail:zjkmmd@163.com

#Time:2018-08-06 15:05:32

#Name:py1.py

#Version:V1.0

#Description:This is a script.

f = open("/tmp/python.txt","r+",encoding="utf-8")

date = f.read(3)

f.write("老铁666")

print(date)

f.close()

[root@wolaixunshan ~]# python3 py1.py

ABC

[root@wolaixunshan ~]# cat /tmp/python.txt

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

老铁666[root@wolaixunshan ~]#

##会发现数据是加到末尾了并不是光标的所在处!这点需要注意

48304ba5e6f9fe08f3fa1abda7d326ab.png

#4.以bytes类型操作的读写、写读、追加写读模式

模式 说明

r+b 读写,可读,可写

w+b 写读,可写,可读

a+b 追加写读,可写,可读

四、操作文件的方法

常用的函数:

1.file.close()

说明:用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发 ValueError 错误。 close() 方法允许调用多次。当 file 对象,被引用到操作另外一个文件时,Python 会自动关闭之前的 file 对象。 使用 close() 方法关闭文件是一个好的习惯。

语法:file。close()

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

#打开文件

f = open("python.txt", "wb")

print("文件名为: ", f.name)

#关闭文件

f.close()

48304ba5e6f9fe08f3fa1abda7d326ab.png

2.file.flush()

说明:用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

语法:file.flush()

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

#打开文件

f = open("python.txt", "wb")

print("文件名为: ", f.name)

#刷新缓冲区数据到磁盘

f.flush()

#关闭文件

f.close()

48304ba5e6f9fe08f3fa1abda7d326ab.png

3.file.read(size)

说明:用于从文件读取指定的字符数,如果未给定或为负则读取所有。如果使用的是rb模式,则读取出来的是size个字节

参数:size -------> 指定从文件读取的字符数或字节数;

返回值:返回从字符串中读取的字符或字节;

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r",encoding="utf-8")

date = f.read(1)

print(date)

f.close()

[root@wolaixunshan ~]# python3 py1.py

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","rb")

date = f.read(3)

print(date)

f.close()

[root@wolaixunshan ~]# python3 py1.py

b'\xe5\xbc\xa0'

>>> s = b'\xe5\xbc\xa0'

>>> print(s.decode("UTF-8"))

48304ba5e6f9fe08f3fa1abda7d326ab.png

4.file.fileno()

说明:返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作

语法:file.fileno()

返回值:返回文件描述符。

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","rb")

print("文件名为:",f.name)

fid = f.fileno()

print("文件描述符:",fid)

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

文件描述符: 3

48304ba5e6f9fe08f3fa1abda7d326ab.png

5.file.isatty()

说明:检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False;

语法:file.isatty

返回值:如果连接到一个终端设备返回 True,否则返回 False;

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","rb")

print("文件名为:",f.name)

ret = f.isatty()

print("返回值:",ret)

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

返回值: False

48304ba5e6f9fe08f3fa1abda7d326ab.png

6.file.readline(size)

说明:用于从文件读取整行,包括 "\n" 字符。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符;

语法:file.readline(size)

参数:size ----------> 从文件中读取的字节数或字符数;如果是rb模式就是读取的字节,如果是普通模式就是读取的字符;

返回值:返回从字符串中读取的字节或字符;

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r")

print("文件名为:",f.name)

line = f.readline().strip()

print("读取一行:",line)

ret = f.readline(4)

print("读取4个字符:",ret)

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

读取一行: 张鋆康

读取4个字符: ABCD

48304ba5e6f9fe08f3fa1abda7d326ab.png

7.file.readlines()

说明:用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。 如果碰到结束符 EOF 则返回空字符串;

语法:file.readlines()

返回值:返回列表,包含所有的行;

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

[root@wolaixunshan ~]# vim py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r")

print("文件名为:",f.name)

line = f.readlines()

print("读取全部行:",line)

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

读取全部行: ['张鋆康\n', 'ABCDEFG\n', 'HIJKLMN\n', 'OPQRST\n', 'UVWXYZ\n']

48304ba5e6f9fe08f3fa1abda7d326ab.png

8.seek(self, offset: int, whence: int = 0)

说明:用于移动文件读取指针到指定位置。

语法:file.seek( offset: int, whence: int = 0)

参数:offset -----------> 开始的偏移量,也就是代表需要移动偏移的字节数,正数表示向右偏移,负数表示向左偏移;

whence --------> 可选,默认值为0,给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r")

print("文件名为:",f.name)

line = f.readline(2).strip()

print("读取一行的前两个字符:",line)

f.seek(0)

line1 = f.readline().strip()

print("读取一整行:",line1)

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

读取一行的前两个字符: 张鋆

读取一整行: 张鋆康

48304ba5e6f9fe08f3fa1abda7d326ab.png

9.tell(self)

说明:返回文件的当前位置,即文件指针当前位置

语法:file.tell()

返回值:返回文件的当前位置;

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

张鋆康

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

[root@wolaixunshan ~]# vim py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r")

print("文件名为:",f.name)

line = f.readline().strip()

print("读取一行:",line)

num = f.tell()

print("当前光标所在位置:",num)

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

读取一行: 张鋆康

当前光标所在位置: 10

48304ba5e6f9fe08f3fa1abda7d326ab.png

10.truncate(self, size: int = None)

说明:用于从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后 V 后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。

语法:file.truncate(self, size: int = None)

参数:size ---------- > 如果存在则文件截断为size字节,没有参数的话则截断到光标出;

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

[root@wolaixunshan ~]# vim py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r+")

print("文件名为:",f.name)

f.seek(6)

f.truncate()

f.close()

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆[root@wolaixunshan ~]#

-----------------有参数截取-----------------------------------------

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

ABCDEFG

HIJKLMN

OPQRST

UVWXYZ

[root@wolaixunshan ~]# vim py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r+")

print("文件名为:",f.name)

f.seek(6)

f.truncate(15)

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

ABCDE[root@wolaixunshan ~]#

48304ba5e6f9fe08f3fa1abda7d326ab.png

11.file.write(str)

说明:用于向文件中写入指定字符串。在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。

如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not 'str'。

语法:file.write(str)

参数:str ---------> 要写入文件的字符串;

返回值:返回的是写入的字符长度;

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

ABCDE[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r+")

print("文件名为:",f.name)

f.write("你好呀!")

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

[root@wolaixunshan ~]# cat /tmp/python.txt

你好呀!CDE[root@wolaixunshan ~]#

48304ba5e6f9fe08f3fa1abda7d326ab.png

12.file.writelines()

说明:用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表。换行需要制定换行符 \n。

语法:file.writelines(item)

参数:item ------> 要写入文件的字符串序列。

实例:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@wolaixunshan ~]# cat /tmp/python.txt

张鋆康

[root@wolaixunshan ~]# cat py1.py

#!/usr/bin/python3

#-*- coding:UTF-8 -*-

f = open("/tmp/python.txt","r+")

print("文件名为:",f.name)

li = ["中国","北京","沙河"]

f.writelines(li)

f.close()

[root@wolaixunshan ~]# python3 py1.py

文件名为: /tmp/python.txt

[root@wolaixunshan ~]# cat /tmp/python.txt

中国北京沙河[root@wolaixunshan ~]#

48304ba5e6f9fe08f3fa1abda7d326ab.png

五、文件内的光标移动

1.read(3)

文件打开方式为文本模式时,代表读取3个字符;

文件打开方式为b模式时,代表读取3个字节;

2.其余的文件内光标移动都是以字节为单位如seek,tell,truncate

注意:seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的;

truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果;

六、文件的修改

文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

48304ba5e6f9fe08f3fa1abda7d326ab.png

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:

data=read_f.read() #全部读入内存,如果文件很大,会很卡

data=data.replace('alex','SB') #在内存中完成修改

write_f.write(data) #一次性写入新文件

os.remove('a.txt')

os.rename('.a.txt.swap','a.txt')

48304ba5e6f9fe08f3fa1abda7d326ab.png

方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件;

48304ba5e6f9fe08f3fa1abda7d326ab.png

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:

for line in read_f:

line=line.replace('alex','SB')

write_f.write(line)

os.remove('a.txt')

os.rename('.a.txt.swap','a.txt')

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值