第1章 文件简介
- 文件:Python中文件是对象;
- Linux文件:一切设备都可以看成是文件。如:磁盘文件、管道、网络Socket、外接U盘和SD卡等;
- 文件属性:用户、读、写、执行权限;
- 具体示例
- 打开终端
Terminal
,进入学习目录下,查看文件目录,有1个文件:file.py
XZ:/ XZ$ cd Users/xz/learn/
XZ:learn XZ$ ls
file.py
- 查看文件内容:有3行内容
XZ:learn XZ$ cat file.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
print('Hello Python')
- 查看文件属性
XZ:learn XZ$ ls -l
total 8
-rw-r--r-- 1 xz staff 67 11 11 18:26 file.py
语法 | 属性 | 含义说明 |
---|---|---|
- | 文件类型 | 横杠表示普通文件,若为d 表示文件目录 |
rw-r--r-- | 访问权限 | 分3组表示用户、群组和其他用户的文件访问权限; |
1 | 文件数量 | 本例中仅1个文件 |
xz | 所在用户 | 本例中用户名为xz |
staff | 所在群组 | 本例中用户群组为staff |
67 | 文件大小 | 本例中文件有67个字节 |
11 11 18:26 | 修改日期 | 本例中为11-11 18:26 |
file.py | 文件名称 | 本例中为file.py |
- 修改访问权限
语法:chmod 用户 操作 权限 文件
用户:u
表示用户(user)、g
表示群组(group)、o
表示其他用户(other)、a
表
示全部用户。缺失的情况下默认为所有用户;
操作:+
表示增加权限、-
表示取消权限、=
表示赋值权限;
权限:r
表示可读(read)、w
表示可写(write)、x
表示可执行(execute);
文件:不指定文件名时,操作对象为当前目录下的所有文件。
备注:可以使用数字表示权限部分的读/写/可执行
权限类型,1
表示可执
行、2
表示可写、4
表示可读,每种类型数字相加所得到的值表示交
叉部分的公共类型。使用三个数字可以依次表示u、g、o三种用户类型
的访问权限。数字和权限类型的对应关系:
所有用户对该文件均没有可执行权限
XZ:learn XZ$ ls -l
total 8
-rw-r--r-- 1 xz staff 67 11 11 18:26 file.py
执行该文件会报错:无权限
XZ:learn XZ$ ./file.py
-bash: ./file.py: Permission denied
为所有用户增加可执行权限
XZ:learn XZ$ chmod +x file.py
XZ:learn XZ$ ls -l
total 8
-rwxr-xr-x 1 xz staff 67 11 11 18:26 file.py
为g增加可写权限
XZ:learn XZ$ chmod 775 file.py
XZ:learn XZ$ ls -l
total 8
-rwxrwxr-x 1 xz staff 67 11 11 18:26 file.py
执行文件:可以输出内容
XZ:learn XZ$ ./file.py
Hello Python
第2章 打开文件
- 语法:
open(path [, mode[buf]])
path
:文件路径
mode
:打开方式,如:只读、只写、读写
buf
:设置内核缓存区的大小 - 打开方式
mode | 说明 | 备注 |
---|---|---|
‘r’ | 只读方式打开 | 文件必须存在 |
‘w’ | 只写方式打开 | 文件不存在创建文件,文件存在清空文件 |
‘a’ | 追加方式打开 | 文件不存在则创建文件 |
‘r+’、 ‘w+’ | 读写方式打开 | |
‘a+’ | 追加和读写方式打开 |
- 示例
- 在学习目录下,进入ipython,查看当前文件目录,有一个文件
XZ:learn XZ$ ipython
Python 3.6.4 |Anaconda custom (64-bit)| (default, Jan 16 2018, 12:04:33)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: ls
file.py*
- 打开文件,查看文件对象
In [2]: f = open('file.py')
In [3]: type(f)
Out[3]: _io.TextIOWrapper
- 读取文件
In [7]: c = f.read()
In [8]: c
Out[8]: "#!/usr/bin/env python\n# -*- coding:utf-8 -*-\n\nprint('Hello Python')"
- 写入内容:报错,原因:打开文件时没有设置写入权限
In [9]: f.write('test python')
---------------------------------------------------------------------------
UnsupportedOperation Traceback (most recent call last)
in ()
----> 1 f.write('test python')
UnsupportedOperation: not writable
- 打开一个不存在的文件,设置打开方式为只写
('w')
,并写入内容
In [18]: f = open('learn.txt', 'w')
In [19]: f.write('test write python')
Out[19]: 17
In [20]: f.close()
In [21]: ls
file.py* learn.txt
In [22]: cat learn.txt
test write python
- 重新以只写方式
('w')
打开上述创建的learn文本,发现已清空
In [25]: f = open('learn.txt', 'w')
In [26]: f.close()
In [27]: ls
file.py* learn.txt
In [28]: cat learn.txt
- 以追加方式
(a)
打开文件file.py,写入内容并查看
In [30]: f = open('file.py', 'a')
In [31]: f.write('test a ')
In [32]: f.close()
In [33]: ls
file.py* learn.txt
In [34]: cat file.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
print('Hello Python')
test a
- 以读写方式
(r+)
打开文件file.py,写入内容并查看
In [36]: f = open('file.py', 'r+')
In [37]: f.write('test r+')
In [38]: f.close()
In [39]: cat file.py
test r+bin/env python
# -*- coding:utf-8 -*-
print('Hello Python')
test a
- 以读写方式
(w+)
打开文件file.py,虽然有读写权限,但是会把文件原内容清空
In [46]: f = open('file.py', 'w+')
In [47]: f.read()
Out[47]: ''
In [48]: f.write('test w+ write')
Out[48]: 13
In [49]: f.close()
In [50]: cat file.py
test w+ write
- 其它说明
以二进制方式打开文件:rb
、wb
、ab
、rb+
、wb+
、ab+
除了加一个b选项,和普通的打开方式用法一样
用途:打开图片、视频等文件
第3章 读取文件
- 语法
read([size])
:读取文件,可设置读取size个字节,默认全读
readline([size])
:默认(最多)
读取一行,可设置读取size个字节(不超过1行)
readlines([size])
:默认读完文件,返回每一行组成的列表。设置size时,
返回size / len(line)向上取整的行数。文件很大时不推荐该用法
iter()
:使用迭代器读取文件 - 示例
- 文件
learn.txt
写入3行网址
In [69]: f = open('learn.txt', 'w+')
In [70]: f.write('www.google.com\nwww.google.com\nwww.google.com')
In [71]: f.close()
In [72]: cat learn.txt
www.google.com
www.google.com
www.google.com
-
readline()
:size为:()、100(1行)、5(5个字符)、100(该行剩余的字符)
In [90]: f = open('learn.txt')
In [91]: f.readline()
Out[91]: 'www.google.com\n'
In [92]: f.readline(100)
Out[92]: 'www.google.com\n'
In [93]: f.readline(5)
Out[93]: 'www.g'
In [94]: f.readline(100)
Out[94]: 'oogle.com'
In [95]: f.readline()
Out[95]: ''
-
readlines()
:一行的字符是14个,size为15时返回2行组成的list
In [117]: f.readlines(15)
Out[117]: ['www.google.com\n', 'www.google.com\n']
In [118]: f.readlines()
Out[118]: ['www.google.com']
-
iter()
:使用迭代器可以遍历数据,占用内存小,数据量大时推荐该用法
已知:`learn.txt`中有16行谷歌网址
In [2]: f = open('learn.txt')
In [3]: iter_f = iter(f) # 生成迭代器
In [4]: lines = 0 # 记录行数
In [5]: for line in iter_f: #遍历迭代器
...: lines += 1
...:
In [6]: lines
Out[6]: 16
第4章 写入文件
- 语法
write(str)
:将字符串写入文件
writelines(sequence_of_strings)
:写多行到文件,参数是可迭代对象 - 示例
-
write()
:必须是字符串,写入文件
In [11]: f = open('learn.txt', 'w')
In [12]: f.write('test w python')
In [13]: f.close()
In [14]: cat learn.txt
test w python
-
writelines()
:参数是可迭代对象:字符串、字符串组成的元组、列表
In [15]: f = open('learn.txt', 'w')
In [16]: f.writelines('123456') # 写入数字组成的字符串
In [17]: f.close()
In [18]: cat learn.txt
123456
In [19]: f = open('learn.txt', 'w')
In [20]: f.writelines(['python', 'test']) #写入字符串组成的列表
In [21]: f.close()
In [22]: cat learn.txt
pythontest
In [23]: f = open('learn.txt', 'w')
In [24]: f.writelines([1, 3, 4]) # 写入数字组成的列表:报错
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 f.writelines([1, 3, 4])
TypeError: write() argument must be str, not int
- 缓存机制
- 写入文件后,不关闭,则数据在内核缓存区,磁盘文件依然为空,关闭文件时,内核才会把数据从缓存区保存到磁盘文件;
- 当写入的数据量大于或等于缓存区时,内核会自动把缓存区的数据保存到磁盘文件,即缓存区满时,会自动整份地保存到磁盘文件,新写入的数据依然会停留在缓存区,直到缓存区再次满时,再自动整份地保存到磁盘文件;
- 内核缓存区大小,可以通过
open()
的参数buf
进行设置。
In [27]: f = open('learn.txt', 'w')
In [28]: f.write('12345')
In [29]: cat learn.txt
In [31]: f.close()
In [32]: cat learn.txt
12345
第5章 关闭文件
- 目的
- 将缓存区数据同步到磁盘;
- Linux系统中每个进程打开的文件个数是有限的;
- 打开文件的数量达到了系统限制,再打开文件就会失败;
- 特别提醒:打开一个文件,操作完成后,立即进行关闭。
- 示例(mac系统)
- 打开ipython,切换到终端,查看当前的进程:有3个,python是第一个
XZ:learn XZ$ ps
PID TTY TIME CMD
34704 ttys000 0:01.46 /Users/xz/anaconda3/bin/python /Users/xz/anaconda3/bin/ipython
68610 ttys000 0:00.20 -bash
34708 ttys001 0:00.02 -bash
- 查看进程的打开文件数量限制:256个
XZ:/ XZ$ ulimit -a #使用命令:launchctl limit 也可以查看
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
- 打开文件257个,查看结果是几个,
file.filen0()
表示打开文件的个数,是个整型数值。
In [1]: f = open('learn.txt', 'w')
In [2]: f.fileno()
Out[2]: 13 #表示当前打开了13个
打开257个文件:打开256个后,就不再打开新的文件;
for循环中,f.fileno()是个局部变量,所以值在13、14间循环。
In [5]: for i in range(257):
...: f = open('learn.txt', 'w')
...: print("%d:%d" % (i, f.fileno()))
...:
...:
0:14
1:13
2:14
3:13
4:14
5:13
....
253:13
254:14
255:13
256:14
- 打开文件257个,并保存打开文件的对象,出现报错
In [4]: lf = []
In [5]: for i in range(257):
...: lf.append(open('learn.txt', 'w'))
...: print("%d:%d" % (i, lf[i].fileno()))
...:
0:13
1:15
2:16
3:17
4:18
5:19
....
237:250
238:251
239:252
240:253
241:254
242:255
ERROR:root:Internal Python error in the inspect module.
Below is the traceback from this internal error.
Traceback (most recent call last):
File "/Users/XZ/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2910, in run_code
File "", line 2, in
lf.append(open('learn.txt', 'w'))
OSError: [Errno 24] Too many open files: 'learn.txt'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/XZ/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 1828, in showtraceback
AttributeError: 'OSError' object has no attribute '_render_traceback_'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/XZ/anaconda3/lib/python3.6/site-packages/IPython/core/ultratb.py", line 1090, in get_records
File "/Users/XZ/anaconda3/lib/python3.6/site-packages/IPython/core/ultratb.py", line 311, in wrapped
File "/Users/XZ/anaconda3/lib/python3.6/site-packages/IPython/core/ultratb.py", line 345, in _fixed_getinnerframes
File "/Users/XZ/anaconda3/lib/python3.6/inspect.py", line 1483, in getinnerframes
File "/Users/XZ/anaconda3/lib/python3.6/inspect.py", line 1441, in getframeinfo
File "/Users/XZ/anaconda3/lib/python3.6/inspect.py", line 696, in getsourcefile
File "/Users/XZ/anaconda3/lib/python3.6/inspect.py", line 725, in getmodule
File "/Users/XZ/anaconda3/lib/python3.6/inspect.py", line 709, in getabsfile
File "/Users/XZ/anaconda3/lib/python3.6/posixpath.py", line 374, in abspath
OSError: [Errno 24] Too many open files
---------------------------------------------------------------------------
第6章 文件指针
- Python读写文件存在的问题
- 写入文件后,必须再次打开才能读取写入的内容;
- 读取文件后,无法再次读取读过的内容;
- Python读写文件时,文件指针移动过程
打开--读取--写入
:3个圆点表示指针移动的过程,没有其它操作,无法使文件指针归位
- 文件指针操作
- 语法
seek(offset [, whence])
offset
:偏移量,可以为负数
whence
:偏移的相对位置 - 相对位置
os.SEEK_SET
:相对文件的起始位置,值为0
os.SEEK_CUR
:相对文件的当前位置,值为1
os.SEEK_END
:相对文件的结束位置,值为2 - 文件当前的偏移
file.tell()
:返回文件当前的偏移量,为整数
- 示例
- 已知文件:learn.txt,内容如下
In [2]: ls
file.py* learn.txt
In [3]: cat learn.txt
0123456789abcdef
- 以
二进制读写
方式打开文件,读取3个字节,并使指针归位。特别地,非二进制读写方式打开文件时,只允许从文件头开始计算相对位置,从文件尾计算时就会引发异常
In [8]: import os
In [9]: f = open('learn.txt', 'rb')
In [10]: f.tell()
Out[10]: 0
In [11]: f.read(3)
Out[11]: '012'
In [12]: f.tell()
Out[12]: 3
In [14]: f.seek(0, os.SEEK_SET)
Out[14]: 0
In [15]: f.tell()
Out[15]: 0
- 指针移动到文件末尾,并读取数据,结果为空
In [16]: f.seek(0, os.SEEK_END)
Out[16]: 16
In [17]: f.tell()
Out[17]: 16
In [18]: f.read(2)
Out[18]: ''
- 指针向回移动5个字节,并读取5个字节的数据
In [49]: f.seek(-5, os.SEEK_CUR)
Out[49]: 11
In [50]: f.read(5)
Out[50]: b'bcdef'
In [51]: f.tell()
Out[51]: 16
- 当偏移量超过文件的长度时,会报错
In [53]: f.tell()
Out[53]: 16
In [54]: f.seek(-20, os.SEEK_SET)
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
in ()
----> 1 f.seek(-20, os.SEEK_SET)
OSError: [Errno 22] Invalid argument
第7章 文件属性
- 文件对象属性
- 查看文件属性
In [5]: f = open('learn.txt')
In [6]: dir(f)
Out[6]:
['_CHUNK_SIZE',
'__class__',
'__del__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__enter__',
'__eq__',
'__exit__',
'__format__',
'__ge__',
'__getattribute__',
'__getstate__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__iter__',
'__le__',
'__lt__',
'__ne__',
'__new__',
'__next__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'_checkClosed',
'_checkReadable',
'_checkSeekable',
'_checkWritable',
'_finalizing',
'buffer',
'close',
'closed',
'detach',
'encoding',
'errors',
'fileno',
'flush',
'isatty',
'line_buffering',
'mode',
'name',
'newlines',
'read',
'readable',
'readline',
'readlines',
'seek',
'seekable',
'tell',
'truncate',
'writable',
'write',
'writelines']
- 常用的文件属性
file.fileno()
: 文件描述符
file.mode
: 文件打开权限
file.encoding
: 文件编码格式
file.closed
: 文件是否关闭
In [56]: f = open('learn.txt')
In [57]: f.fileno()
Out[57]: 12
In [58]: f.mode
Out[58]: 'r'
In [59]: f.encoding
Out[59]: 'UTF-8'
In [61]: f.closed
Out[61]: False
- 标准文件
sys.stdin
:文件标准输入
sys.stdout
:文件标准输出
sys.stderr
:文件标准错误
In [64]: import sys
In [65]: type(sys.stdin)
Out[65]: _io.TextIOWrapper
In [66]: sys.stdin
Out[66]: <_io.TextIOWrapper name='' mode='r' encoding='UTF-8'>
In [67]: sys.stdout
Out[67]: <_io.TextIOWrapper name='' mode='w' encoding='UTF-8'>
In [68]: sys.stderr
Out[68]: <_io.TextIOWrapper name='' mode='w' encoding='UTF-8'>
- 文件命令行参数
sys
模块:提供sys.argv
属性,获取文件命令行参数
sys.argv
属性:是字符串组成的列表,可以接受n个不同的参数
第8章 OS模块操作文件
- 基础函数
- 打开文件:
os.open(file_name, flag [, mode])
,返回文件描述符。flag表示打开文件的方式:os.O_CREAT
:创建文件、os.O_RDONLY
:只读方式、os.O_WRONLY
:只写方式、os.O_RDWR
:读写方式; - 读取文件:
os.read(fd, buffersize)
。fd
表示文件描述符,buffersize
表示读取内容的大小; - 写入文件:
os.write(fd, string)
。fd
表示文件描述符,string
表示写入文件的内容。返回写入数据的大小; - 文件指针操作:
os.lseek(fd, pos, how)
。fd
表示文件描述符; - 关闭文件:
os.close(fd)
。fd
表示文件描述符。 - 示例:创建文件,以读写方式打开,写入内容,移动文件指针,读取刚写入的内容,关闭。
In [2]: import os
In [3]: ls
In [4]: f = os.open('learn.txt', os.O_CREAT | os.O_RDWR)
In [5]: ls
learn.txt*
In [4]: w = os.write(f, 'python learn'.encode())
In [5]: lsk = os.lseek(f, 0, os.SEEK_SET)
In [7]: str1 = os.read(f, 7)
In [8]: str1
Out[8]: b'python '
In [9]: os.close(f)
- 常用函数
os方法 | 说明 |
---|---|
access(path, mode) | 判断文件权限 F_OK/R_OK/W_OK/X_OK |
listdir(path) | 返回当前目录下所有文件组成的列表 |
remove(path) | 删除文件 |
rename(old, new) | 修改文件或目录名称 |
mkdir(path [, mode]) | 创建目录 |
makedirs(path [, mode]) | 创建多级目录 |
removedirs(path) | 删除多级目录 |
rmdirs(path) | 删除目录(目录必须为空) |
- 判断文件是否存在、是否有写权限
In [2]: ls
learn.txt*
In [4]: os.access('learn.txt', os.F_OK)
Out[4]: True
In [5]: os.access('learn.txt', os.W_OK)
Out[5]: True
- 查看当前目录下的文件
In [7]: os.listdir('./')
Out[7]: ['.idea', 'learn.txt']
- 修改文件名称
In [8]: os.rename('learn.txt', 'python_learn.txt')
In [9]: ls
python_learn.txt*
- os.path模块方法
os.path | 说明 |
---|---|
exists(path) | 当前路径是否存在 |
isdir(s) | 是否是一个目录 |
isfile(path) | 是否是一个文件 |
getsize(file_name) | 返回文件大小 |
dirname(p) | 返回路径的目录 |
basename(p) | 返回路径的文件名 |
In [13]: os.path.exists('./python_learn.txt')
Out[13]: True
In [14]: os.path.isdir('./')
Out[14]: True
In [16]: os.path.isfile('python_learn.txt')
Out[16]: True
In [17]: os.path.getsize('python_learn.txt')
Out[17]: 12
In [18]: os.path.dirname('./python_learn.txt')
Out[18]: '.'
In [19]: os.path.basename('./python_learn.txt')
Out[19]: 'python_learn.txt'
第9章 练习
内容:使用Python管理ini文件:查询、添加、删除、保存
目的:掌握文件基本操作、认识ini文件、了解ConfigParser
int文件格式:
[session]
:节、name = value
:参数(键=值)。举例:
[port]
port1 = 8000
port2 = 8001
示例
- 查看当前目录下的ini文件:包含2个节
user info
和study
In [2]: ls
learner.txt
In [3]: cat learner.txt
[user info]
name = xz
pwd = abc
[study]
python_base = 69
python_analysis = 80
linux_base = 100
- 创建configparser管理对象
In [4]: import configparser
In [5]: cfg = configparser.ConfigParser()
- 读取ini文件
In [6]: cfg.read('learner.txt')
Out[6]: ['learner.txt']
- 返回ini文件的节列表
section()
和节参数列表items(section)
In [7]: cfg.sections()
Out[7]: ['user info', 'study']
In [8]: for se in cfg.sections():
...: print(se)
...: print(cfg.items(se))
...:
user info
[('name', 'xz'), ('pwd', 'abc')]
study
[('python_base', '69'), ('python_analysis', '80'), ('linux_base', '100')]
- 修改或增加节参数内容:
set(section, key, value)
In [9]: cfg.set('user info', 'pwd', '123abc')
In [10]: for se in cfg.sections():
...: print(se)
...: print(cfg.items(se))
...:
user info
[('name', 'xz'), ('pwd', '123abc')]
study
[('python_base', '69'), ('python_analysis', '80'), ('linux_base', '100')]
In [11]: cfg.set('user info', 'mail', '[email protected]')
In [12]: for se in cfg.sections():
...: print(se)
...: print(cfg.items(se))
...:
user info
[('name', 'xz'), ('pwd', '123abc'), ('mail', '[email protected]')]
study
[('python_base', '69'), ('python_analysis', '80'), ('linux_base', '100')]
- 删除指定节中的参数:
remove_option(section, key)
In [13]: cfg.remove_option('study', 'python_analysis')
Out[13]: True
In [14]: for se in cfg.sections():
...: print(se)
...: print(cfg.items(se))
...:
user info
[('name', 'xz'), ('pwd', '123abc'), ('mail', '[email protected]')]
study
[('python_base', '69'), ('linux_base', '100')]
- 项目实战:编写一个类,使用configparser管理ini文件
- 导入包,查看文件:2个节
import os
import os.path
import configparser
In [22]: ls
learner.txt
In [38]: cat learner.txt
[user info]
name = xz
pwd = abc12345
[study]
python_base = 69
python_analysis = 80
linux_base = 100
- 编写类,实现:创建configparser对象、读取文件、遍历节和参数、删除参数、删除节、增加节和参数、保存
In [36]: class user_info(object):
...:
...: def __init__(self, filename):
...: self.logfile = filename
...: self.cfg = configparser.ConfigParser()
...:
...: def read(self):
...: self.cfg.read(self.logfile)
...:
...: def dump(self):
...: se_list = self.cfg.sections()
...: print("<========>")
...: for se in se_list:
...: print(se)
...: print(self.cfg.items(se))
...: print("<========>")
...:
...: def delete_item(self, section, key):
...: self.cfg.remove_option(section, key)
...:
...: def delete_section(self, section):
...: self.cfg.remove_section(section)
...:
...: def set_item(self,section, key, value):
...: self.cfg.set(section, key, value)
...:
...: def save(self):
...: fp = open(self.logfile, 'w')
...: self.cfg.write(fp)
...: fp.close()
...:
- 传入示例
In [37]: if __name__ == '__main__':
...: info = user_info('learner.txt')
...: info.read()
...: info.dump()
...: info.set_item('user info', 'pwd', '100000000000')
...: info.dump()
...: info.set_item('score', '2018-11-11', '180')
...: info.set_item('user info', 'mail', '[email protected]')
...: info.dump()
...: info.delete_item('user info', 'mail')
...: info.dump()
...: info.save()
- 演示结果
# 读取文件,遍历节和参数
<========>
user info
[('name', 'xz'), ('pwd', 'abc12345')]
study
[('python_base', '69'), ('python_analysis', '80'), ('linux_base', '100')]
<========>
# 修改参数值,遍历节和参数
<========>
user info
[('name', 'xz'), ('pwd', '100000000000')]
study
[('python_base', '69'), ('python_analysis', '80'), ('linux_base', '100')]
<========>
# 增加节和参数,遍历节和参数
<========>
user info
[('name', 'xz'), ('pwd', '100000000000'), ('mail', '[email protected]')]
study
[('python_base', '69'), ('python_analysis', '80'), ('linux_base', '100')]
score
[('2018-11-11', '180')]
<========>
# 删除参数,遍历节和参数,并保存
<========>
user info
[('name', 'xz'), ('pwd', '100000000000')]
study
[('python_base', '69'), ('python_analysis', '80'), ('linux_base', '100')]
score
[('2018-11-11', '180')]
<========>