学习目标:
掌握Python中文件打开、关闭、读取和写入的具体操作方法
实际开发中常常会遇到对数据进行持久化的场景,所谓持久化是指将数据从无法长久保存数据的存储介质(通常是内存)转移到可以长久保存数据的存储介质(通常是硬盘)中。实现数据持久化最直接简单的方式就是通过文件系统将数据保存到文件中。
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对数据的访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘、光盘、闪存等物理设备的数据块概念,用户使用文件系统来保存数据时,不必关心数据实际保存在硬盘的哪个数据块上,只需要记住这个文件的路径和文件名。在写入新数据之前,用户不必关心硬盘上的哪个数据块没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。
在学习文件操作之前,先来回顾一下编码的相关以及先关数据类型的知识。
字符串类型(
str
),在程序中用于表示文字信息,本质上是unicode
编码中的二进制。1
name = "张亚飞"
字节类型(bytes)
可表示文字信息,本质上是utf-8/gbk等编码的二进制(对unicode进行压缩,方便文件存储和网络传输。)
1
2
3
4
5
6name = "张亚飞"
data = name.encode('utf-8')
print(data) # b'\xe6\xad\xa6\xe6\xb2\x9b\xe9\xbd\x90'
result = data.decode('utf-8')
print(result) # "张亚飞"可表示原始二进制(图片、文件等信息)
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
号 | 方法及描述 |
---|---|
1 | file.close( )关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。 |
6 | file.read([size])) 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | file.readline([size]) 读取整行,包括 “\n” 字符。 |
8 | file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 | file.seek(offset[, whence) 移动文件读取指针到指定位置 |
10 | file.tell() 返回文件当前位置。 |
11 | file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。 |
12 | file.write(str) 将字符串写入文件,返回的是写入的字符长度。 |
13 | file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
一、打开文件
了解了文件系统,我们可以非常方便的通过文件来读写数据;我们在使用文件之前要先将文件打开,在Python中要实现文件操作是非常简单的。我们可以使用Python内置的open
函数来打开文件,open函数语法如下:
1 | open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) |
open函数中的参数有很多,这里介绍5个常用参数:
file参数
file参数用于表示要打开的文件, 可以是字符串或整数。 如果file是字符串, 则表示文件名, 文件名既可以是当前目录的相对路径, 也可以是绝对路径; 如果file是整数, 则表示一个已经打开的文件 。mode参数
mode参数用于设置文件操作模式, 用字符串表示, 这里所说的操作模式是指要打开什么样的文件(字符文件或二进制文件)以及做什么样的操作(读、写或追加),具体如下表所示。
模式 描述 t 文本模式 (默认)。 x 写模式,新建一个文件,如果该文件已存在则会报错。 b 二进制模式。 + 打开一个文件进行更新(可读可写)。 U 通用换行模式(不推荐)。 r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 r+ 打开一个文件用于读写。文件指针将会放在文件的开头。 rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 下图展示了如何根据程序的需要来设置
open
函数的操作模式。模式 r r+ w w+ a a+ 读 + + + + 写 + + + + + 创建 + + + + 覆盖 + + 指针在开始 + + + + 指针在结尾 r+
、rt+
、rb+
,默认光标位置:起始位置1
2
3
4
5
6
7
8
9
10
11
12
13# 文件内容:床前明月光
file_object = open('info.txt', mode='r+', encoding='utf-8')
# 读取内容
data = file_object.read()
print(data) # 床前明月光
# 写入内容
file_object.write("你好呀")
file_object.close()
# 文件内容为 床前明月光你好呀1
2
3
4
5
6
7
8
9
10
11# 文件内容:床前明月光
file_object = open('info.txt', mode='r+', encoding='utf-8')
# 写入内容
file_object.write("李白") # 李白明月光
# 读取内容
data = file_object.read()
print(data) # 明月光
file_object.close()w+
、wt+
、wb+
,默认光标位置:起始位置(清空文件)w+
如果先写入,会将原内容抹去(这其实和w一样),再读的时候要注意加个f.seek()
。如果先读取,会读取不到内容(因为用的是w+,会先抹去文件里面的内容),直接就写入了。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17file_object = open('info.txt', mode='wt+', encoding='utf-8')
# 读取内容 清空
data = file_object.read()
print(data)
# 写入内容
file_object.write("你好呀")
# 将光标位置重置起始
file_object.seek(0)
# 读取内容
data = file_object.read()
print(data) # 你好呀
file_object.close()x+
、xt+
、xb+
,默认光标位置:起始位置(新文件)a+
、at+
、ab+
,默认光标位置:末尾1
2
3
4
5
6
7
8
9file_object = open('info.txt', mode='at+')
# 写入内容
file_object.write("张亚飞")
# 将光标位置重置起始
file_object.seek(0)
# 读取内容
data = file_object.read()
print(data) # 床前明月光张亚飞
file_object.close()
buffering:
设置缓冲。文件io操作的缓冲行为分为:全缓冲:同系统及磁盘块大小有关,n个字节后执行一次写入操作。行缓冲:遇到换行符执行一次写操作。无缓冲:立刻执行写操作。buffering默认为-1,系统默认的全缓冲,buffering可以设置为大于1的任意整数,字节数为buffering的全缓冲,buffering=1,设置为行缓冲模式,buffering=0, 设置为无缓冲模式。
encoding参数
encoding用来指定打开文件时的文件编码, 默认是UTF-8编码, 主要用于打开文本文件。如果需要指定字符编码,可以传入encoding参数,如果不指定,默认值是None,那么在读取文件时使用的是操作系统默认的编码。需要提醒大家,如果不能保证保存文件时使用的编码方式与encoding参数指定的编码方式是一致的,那么就可能因无法解码字符而导致读取文件失败。
errors参数
errors参数用来指定在文本文件发生编码错误时如何处理。 推荐errors参数的取值为’ignore’, 表示在遇到编码错误时忽略该错误, 程序会继续执行, 不会退出。
在使用open
函数时,如果打开的文件是字符文件(文本文件),可以通过encoding
参数来指定读写文件使用的字符编码。没有指定该参数,则使用系统默认的编码作为读写文件的编码。
使用示例:
读取文本文件
info.txt
1
2床前明月光
疑是地上霜代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 1.打开文件
# - 路径:
# 相对路径:'info.txt'
# 绝对路径:'G:/学习/Python学习/Python基础/code/chapter20/info.txt'
# - 模式
# rb,表示读取文件原始的二进制(r, 读 read;b, 二进制 binary;)
# 1.打开文件
file_object = open('info.txt', mode='rb')
# 2.读取文件内容,并赋值给data
data = file_object.read()
print(data) # b'\xe5\xba\x8a\xe5\x89\x8d\xe6\x98\x8e\xe6\x9c\x88\xe5\x85\x89\r\n\xe7\x96\x91\xe6\x98\xaf\xe5\x9c\xb0\xe4\xb8\x8a\xe9\x9c\x9c'
text = data.decode('utf-8')
print(text)
# 床前明月光
# 疑是地上霜
# 3.关闭文件
file_object.close()1
2
3
4
5
6
7
8file_object = open('info.txt', mode='r', encoding='utf-8')
# 2.读取文件内容,并赋值给data
data = file_object.read()
print(data)
# 床前明月光
# 疑是地上霜
# 3.关闭文件
file_object.close()读取图片等非文本内容文件
1
2
3
4file_object = open('图片.jpg', mode='rb')
data = file_object.read()
print(data) # b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00`\x00...'
file_object.close()
注意事项:
路径
相对路径:相对与某个基准目录的路径,默认基准目录位于运行代码所在路径。
例如,file_example.py和图片.jpg在同一目录下,那么file_example.py中读取图片.jpg的相对路径可以写成
1
2
3
4
5
6
7
8
9
10
11G:\学习\Python学习\Python基础\code\chapter20 的目录
2020/12/23 16:39 <DIR> .
2020/12/23 16:39 <DIR> ..
2020/12/23 16:39 1,332 file_example1.py
2020/12/23 16:31 32 info.txt
2020/12/23 16:38 99,579 图片.jpg
3 个文件 100,943 字节
2 个目录 574,338,805,760 可用字节
G:\学习\Python学习\Python基础\code\chapter20>python file_example1.py1
file_object = open('图片.jpg', mode='rb')
绝对路径:绝对路径是指文件在硬盘上存储的完整路径。
上例中的绝对路径为
1
2
3
4file_object = open('G:/学习/Python学习/Python基础/code/chapter20/图片.jpg', mode='rb')
data = file_object.read()
print(data) # b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00`\x00...'
file_object.close()
读文件时,文件不存在程序会报错。
1
2
3
4Traceback (most recent call last):
File "G:/学习/Python学习/Python基础/code/chapter20/file_example1.py", line 36, in <module>
file_object = open('图片1.jpg', mode='rb')
FileNotFoundError: [Errno 2] No such file or directory: '图片1.jpg'1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 判断路径是否存在?
import os
file_path = "G:\学习\Python学习\Python基础\code\chapter20\info.txt"
exists = os.path.exists(file_path)
if exists:
# 1.打开文件
file_object = open('info.txt', mode='r', encoding='utf-8')
# 2.读取文件内容,并赋值给data
data = file_object.read()
# 3.关闭文件
file_object.close()
print(data)
else:
print("文件不存在")
二、关闭文件
在打开文件后, 如果不再使用该文件, 则应该将其关闭, 会用到close() 方法。
在finally代码块中关闭文件
对文件的操作往往会抛出异常, 为了保证对文件的操作无论是正常结束还异常结束, 都能够关闭文件, 我们应该将对close() 方法的调用放在异常处理的finally代码块中。1
2
3
4
5
6
7
8
9
10
11
12
13try:
f = open('data.txt', mode='r')
print('文件打开成功')
print(file.read())
...
except FileNotFoundError:
print('文件不存在')
except OSError:
print('处理OS异常')
finally:
if f is not None:
f.close()
print('文件关闭成功')在with as 代码块中关闭文件(上下文语法)
对于
open
函数返回的文件对象,还可以使用with
上下文语法在文件操作完成后自动执行文件对象的close
方法,这样可以让代码变得更加简单,因为不需要再写finally
代码块来执行关闭文件释放资源的操作。需要提醒大家的是,并不是所有的对象都可以放在with
上下文语法中,只有符合上下文管理器协议(有__enter__
和__exit__
魔术方法)的对象才能使用这种语法,Python标准库中的contextlib
模块也提供了对with
上下文语法的支持,后面再为大家进行讲解。1
2
3
4
5
6
7
8
9try:
with open('data.txt', 'r', encoding='utf-8') as file:
print(file.read())
except FileNotFoundError:
print('无法打开指定的文件!')
except LookupError:
print('指定了未知的编码!')
except UnicodeDecodeError:
print('读取文件时解码错误!')with as提供了一个代码块, 在as后面声明一个资源变量, 在with as代码块结束之后自动释放资源。
在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:
1
2with open("xxxx.txt", mode='rb') as f1, open("xxxx.txt", mode='rb') as f2:
pass
三、读写文本文件
read(size)
:从文件中读取字符串, size限制读取的字符数, 默认size=-1,指对读取所有内容。readline(size)
:在读取到换行符或文件尾时返回单行字符串。 如果已经到文件尾, 则返回一个空字符串。 size是限制读取的字符数, size=-1表示没有限制。readlines()
: 读取文件数据到一个字符串列表中, 每一行数据都是列表的一个元素。write(s)
:将字符串s写入文件中, 并返回写入的字符数。writelines(lines)
: 向文件中写入一个字符串列表。 不添加行分隔符, 因此通常为每一行末尾都提供行分隔符flush()
:刷新写缓冲区, 在文件没有关闭的情况下将数据写入文件中。
示例
read(), 读
读所有【常用】
1
2
3f = open('info.txt', mode='r',encoding='utf-8')
data = f.read()
f.close()1
2
3f = open('info.txt', mode='rb')
data = f.read()
f.close()读n个字符(字节)【会用到】
1
2
3
4
5
6
7# 文件内容 张亚飞
f = open('info.txt', mode='r', encoding='utf-8')
# 读1个字符
data = f.read(1)
f.close()
print(data) # 张1
2
3
4
5
6
7
8f = open('info.txt', mode='r',encoding='utf-8')
# 读1个字符
chunk1 = f.read(1)
chunk2 = f.read(2)
print(chunk1,chunk2) # 张 亚飞
f.close()1
2
3
4
5
6
7f = open('info.txt', mode='rb')
# 读1个字节
data = f.read(3)
f.close()
print(data, type(data)) # b'\xe5\xba\x8a' <class 'bytes'>1
2
3
4
5
6
7
8
9f = open('info.txt', mode='rb')
# 读1个字节
chunk1 = f.read(3)
chunk2 = f.read(3)
chunk3 = f.read(1)
print(chunk1,chunk2,chunk3) # b'\xe5\xba\x8a' b'\xe5\x89\x8d' b'\xe6'
f.close()
readline()
方法1
2
3
4
5
6
7
8
9f = open('info.txt', mode='r', encoding='utf-8')
v1 = f.readline()
print(v1) # 床前明月光\n
v2 = f.readline()
print(v2) # 疑是地上霜\n
f.close()1
2
3
4
5
6
7
8
9f = open('info.txt', mode='r', encoding='utf-8')
v1 = f.readline()
print(v1) # 床前明月光\n
f.close()
f = open('info.txt', mode='r', encoding='utf-8')
v2 = f.readline()
print(v2) # 床前明月光\n
f.close()
readlines()
,读所有行,每行作为列表的一个元素1
2
3
4f = open('info.txt', mode='r', encoding='utf-8')
data_list = f.readlines()
f.close()
print(data_list) # ['床前明月光\n', '疑是地上霜']
for in循环,读大文件(readline加强版)【常见】
1
2
3
4
5
6f = open('info.txt', mode='r', encoding='utf-8')
for line in f:
print(line.strip())
f.close()
# 床前明月光
# 疑是地上霜
write 写入
如果要向文件中写入内容,可以在打开文件时使用
w
或者a
作为操作模式,前者会截断之前的文本内容写入新的内容,后者是在原来内容的尾部追加新的内容。1
2
3f = open('info.txt', mode='a',encoding='utf-8')
f.write("张亚飞")
f.close()1
2
3f = open('info.txt', mode='ab')
f.write( "张亚飞".encode("utf-8") )
f.close()
flush,刷到硬盘
1
2
3
4
5
6
7
8f = open('info.txt', mode='a',encoding='utf-8')
while True:
# 不是写到了硬盘,而是写在缓冲区,系统会将缓冲区的内容刷到硬盘。
f.write("张亚飞")
f.flush()
f.close()1
2
3
4
5
6
7
8
9
10
11
12file_object = open('files/account.txt', mode='a')
while True:
user = input("用户名:")
if user.upper() == "Q":
break
pwd = input("密码:")
data = "{}-{}\n".format(user, pwd)
file_object.write(data)
file_object.flush()
file_object.close()
移动光标位置(字节)
1
2
3
4
5
6
7f = open('info.txt', mode='r+', encoding='utf-8')
# 移动到指定字节的位置
f.seek(3)
f.write("张亚飞")
f.close()注意:在a模式下,调用write在文件中写入内容时,永远只能将内容写入到尾部,不会写到光标的位置。
获取当前光标位置
1
2
3
4
5
6
7
8
9
10
11f = open('info.txt', mode='r', encoding='utf-8')
p1 = f.tell()
print(p1) # 0
f.read(3) # 读3个字符 3*3=9字节
p2 = f.tell()
print(p2) # 9
f.close()1
2
3
4
5
6
7
8
9
10
11f = open('info.txt', mode='rb')
p1 = f.tell()
print(p1) # 0
f.read(3) # 读3个字节
p2 = f.tell()
print(p2) # 3
f.close()
基础案例
案例1:复制一个文件到另一个文件中
将原始文件
src_file.txt
中的内容写入到文件dest.txt
中。注意,src_file.txt
以gbk
方式编码,要求用utf-8
写入。1
2
3
4
5
6
7Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
...示例代码:
1
2
3
4
5with open('src_file.ttx', mode='r', encoding='gbk') as f1:
content = f1.read()
with open('dest_file.txt', mode='w', encoding='utf-8') as f2:
f2.write(content)
print('文件复制成功')
案例2:用户注册,获取用户输入用户名和密码,将其写入到文件中
1
2
3
4
5
6user = input("请输入用户名:")
pwd = input("请输入密码:")
data = "{}-{}".format(user, pwd)
file_object = open("files/info.txt", mode='wt', encoding='utf-8')
file_object.write(data)
file_object.close()
案例3:多用户注册
1
2
3
4
5
6
7
8
9
10
11# w写入文件,先清空文件;再在文件中写入内容。
file_object = open("files/info.txt", mode='wt', encoding='utf-8')
while True:
user = input("请输入用户名:")
if user.upper() == "Q":
break
pwd = input("请输入密码:")
data = "{}-{}\n".format(user, pwd)
file_object.write(data)
file_object.close()
四、读写二进制文件
读写二进制文件跟读写文本文件的操作类似,但是需要注意,在使用open
函数打开文件时,如果要进行读操作,操作模式是'rb'
,如果要进行写操作,操作模式是'wb'
。还有一点,读写文本文件时,read
方法的返回值以及write
方法的参数是str
对象(字符串),而读写二进制文件时,read
方法的返回值以及write
方法的参数是bytes-like
对象(字节串)。下面的代码实现了将当前路径下名为guido.jpg
的图片文件复制到吉多.jpg
文件中的操作。
1 | try: |
如果要复制的图片文件很大,一次将文件内容直接读入内存中可能会造成非常大的内存开销,为了减少对内存的占用,可以为read
方法传入size
参数来指定每次读取的字节数,通过循环读取和写入的方式来完成上面的操作,代码如下所示。
1 | try: |
小高级案例:超前
利用Python想某个网址发送请求并获取结果(利用第三方的模块)
下载第三方模块
requests
1
pip install requests
使用
1
2
3
4import requests
res = requests.get(url="网址")
print(res)案例1:去网上下载一点文本,文本信息写入文件。
1
2
3
4
5
6
7
8
9
10import requests
res = requests.get(url="https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20",
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}
)
# 网络传输的原始二进制信息(bytes)
# res.content
file_object = open('movie.txt', mode='wb')
file_object.write(res.content)
file_object.close()案例2:去网上下载一张图片,图片写入本地文件。
1
2
3
4
5
6
7
8
9import requests
res = requests.get(url="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1031041206,3898962502&fm=26&gp=0.jpg",headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"}
)
# 网络传输的原始二进制信息(bytes)
# res.content
file_object = open('img1.png', mode='wb')
file_object.write(res.content)
file_object.close()
注意事项:
- 路径
- 绝对路径
- 相对路径
- 文件不存在时,w模式会新建然后再写入内容;文件存在时,w模式会清空文件再写入内容。
五、文件和文件夹操作
除了文件读写之外,关于文件的其他操纵可以通过os
模块。
1. 文件删除
语法:你可以用remove()
方法删除文件,需要提供要删除的文件名作为参数。
1 | os.remove(file_name) |
示例:下例将删除一个已经存在的文件test2.txt。
1 | import os |
2. 文件重命名
语法:rename()方法需要两个参数,当前的文件名和新文件名。
1 | os.rename(current_file_name, new_file_name) |
例子:下例将重命名一个已经存在的文件test1.txt。
1 | import os |
3. 创建和删除文件夹
创建文件夹
语法:可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数。
1
os.mkdir(newdir)
示例:下例将在当前目录下创建一个新目录test。
1
2
3import os
# 创建目录test
os.mkdir("test")删除文件夹
语法:
rmdir()
方法删除目录,目录名称以参数传递,在删除这个目录之前,它的所有内容应该先被清除。1
os.rmdir('dirname')
示例:以下是删除” /tmp/test”目录的例子。目录的完全合规的名称必须被给出,否则会在当前目录下搜索该目录。
1
2
3import os
# 删除”/tmp/test”目录
os.rmdir( "/tmp/test" )
4. 获取和切换目录
- 获取当前目录
1 | os.getcwd() |
- 切换指定目录
语法:可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。1
os.chdir("newdir")
5. 获取当前目录下所有文件列表
语法:获取当前目录下所有文件列表有两种实现方法。
1 | os.listdir(dir) |
6. 文件备份
要求:用户输入需要备份的文件名,对文件进行备份,备份文件名为原文件名后加[复件],后缀不变。如test.txt的备份文件为test[复件].txt。
代码实现:
1 | #1.获取文件名 |
7.练习:批量文件重命名
要求:提示用户输入重命名的文件夹名称,对文件夹中所有文件进行重命名,并写入到新文件夹,新文件夹的名称为原始文件夹名后加[备份]
,。命名规则为在原名之前加[飞凡空间]-
,如原始文件名为图片.png
,新名为[飞凡空间]-图片.png
。
六、巩固提升
日志分析,计算某用户
223.73.89.192
访问次数。日志文件如下:access.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1749.89.167.91 - - [17/Dec/2020:03:43:50 +0800] "GET /wiki/detail/3/40 HTTP/1.1" 301 0 "-" "Mozilla/5.0(Linux;Android 5.1.1;OPPO A33 Build/LMY47V;wv) AppleWebKit/537.36(KHTML,link Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 LieBaoFast/4.51.3" "-"
49.89.167.91 - - [17/Dec/2020:03:44:11 +0800] "GET /wiki/detail/3/40/ HTTP/1.1" 200 8033 "-" "Mozilla/5.0(Linux;Android 5.1.1;OPPO A33 Build/LMY47V;wv) AppleWebKit/537.36(KHTML,link Gecko) Version/4.0 Chrome/43.0.2357.121 Mobile Safari/537.36 LieBaoFast/4.51.3" "-"
203.208.60.66 - - [17/Dec/2020:03:47:58 +0800] "GET /media/uploads/2019/11/17/pic/s1.png HTTP/1.1" 200 710728 "-" "Googlebot-Image/1.0" "-"
223.73.89.192 - - [17/Dec/2020:03:48:26 +0800] "GET /wiki/detail/3/40/ HTTP/1.1" 200 8033 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:26 +0800] "GET /static/stark/plugins/font-awesome/css/font-awesome.css HTTP/1.1" 200 37414 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:26 +0800] "GET /static/stark/plugins/bootstrap/css/bootstrap.css HTTP/1.1" 200 146010 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:26 +0800] "GET /static/web/css/commons.css HTTP/1.1" 200 3674 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:26 +0800] "GET /static/mdeditor/editormd/css/editormd.preview.css HTTP/1.1" 200 60230 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:26 +0800] "GET /static/stark/js/jquery-3.3.1.min.js HTTP/1.1" 200 86927 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:26 +0800] "GET /static/stark/plugins/bootstrap/js/bootstrap.min.js HTTP/1.1" 200 37045 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:26 +0800] "GET /static/mdeditor/editormd/lib/marked.min.js HTTP/1.1" 200 19608 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:27 +0800] "GET /static/mdeditor/editormd/lib/prettify.min.js HTTP/1.1" 200 17973 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:27 +0800] "GET /static/mdeditor/editormd/fonts/fontawesome-webfont.woff2?v=4.3.0 HTTP/1.1" 200 56780 "https://pythonav.com/static/mdeditor/editormd/css/editormd.preview.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:27 +0800] "GET /static/mdeditor/editormd/editormd.js HTTP/1.1" 200 163262 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:28 +0800] "GET /static/mdeditor/mdeditor-preview-init.js HTTP/1.1" 200 261 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:29 +0800] "GET /static/stark/plugins/font-awesome/fonts/fontawesome-webfont.woff2?v=4.7.0 HTTP/1.1" 200 77160 "https://pythonav.com/static/stark/plugins/font-awesome/css/font-awesome.css" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"
223.73.89.192 - - [17/Dec/2020:03:48:29 +0800] "GET /media/uploads/2019/02/22/Gobook/_book/ssl2.png HTTP/1.1" 200 203535 "https://pythonav.com/wiki/detail/3/40/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.60" "-"日志分析升级,计算所有用户的访问次数。
筛选出股票 当前价大于 20 的所有股票数据。
1
2
3
4
5
6
7
8
9
10
11股票代码,股票名称,当前价,涨跌额,涨跌幅,年初至今,成交量,成交额,换手率,市盈率(TTM),股息率,市值
SH601778,N晶科,6.29,+1.92,+43.94%,+43.94%,259.66万,1625.52万,0.44%,22.32,-,173.95亿
SH688566,吉贝尔,52.66,+6.96,+15.23%,+122.29%,1626.58万,8.09亿,42.29%,89.34,-,98.44亿
SH688268,华特气体,88.80,+11.72,+15.20%,+102.51%,622.60万,5.13亿,22.87%,150.47,-,106.56亿
SH600734,实达集团,2.60,+0.24,+10.17%,-61.71%,1340.27万,3391.14万,2.58%,亏损,0.00%,16.18亿
SH900957,凌云B股,0.36,+0.033,+10.09%,-35.25%,119.15万,42.10万,0.65%,44.65,0.00%,1.26亿
SZ000584,哈工智能,6.01,+0.55,+10.07%,-4.15%,2610.86万,1.53亿,4.36%,199.33,0.26%,36.86亿
SH600599,熊猫金控,6.78,+0.62,+10.06%,-35.55%,599.64万,3900.23万,3.61%,亏损,0.00%,11.25亿
SH600520,文一科技,8.21,+0.75,+10.05%,-24.05%,552.34万,4464.69万,3.49%,亏损,0.00%,13.01亿
SH603682,锦和商业,11.73,+1.07,+10.04%,+48.29%,2746.63万,3.15亿,29.06%,29.62,-,55.42亿
SZ300831,派瑞股份,12.27,+1.12,+10.04%,+208.29%,25.38万,311.41万,0.32%,60.59,-,39.26亿实现名片管理系统文件版。
要求:功能包含添加、删除、修改、查询一个名片,查询所有名片,保存信息、退出系统功能。每次运行系统从文件中加载名片数据,用户选择保存信息将信息写入文件。
七、简单的总结
通过读写文件的操作,我们可以实现数据持久化。在Python中可以通过open
函数来获得文件对象,可以通过文件对象的read
和write
方法实现文件读写操作。如果要对文件或文件夹进行创建、删除等操作,可以通过os
模块来实现,当然,os
模块的功能还有很多,之后我们还会再介绍。学了文件相关操作之后,我们的技能库又丰富了一些。