Python中的文件处理

第1章 文件简介


  1. 文件:Python中文件是对象;
  2. Linux文件:一切设备都可以看成是文件。如:磁盘文件、管道、网络Socket、外接U盘和SD卡等;
  3. 文件属性:用户、读、写、执行权限;
  4. 具体示例
  • 打开终端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章 打开文件


  1. 语法open(path [, mode[buf]])
    path:文件路径
    mode:打开方式,如:只读、只写、读写
    buf:设置内核缓存区的大小
  2. 打开方式
mode 说明 备注
‘r’ 只读方式打开 文件必须存在
‘w’ 只写方式打开 文件不存在创建文件,文件存在清空文件
‘a’ 追加方式打开 文件不存在则创建文件
‘r+’、 ‘w+’ 读写方式打开
‘a+’ 追加和读写方式打开
  1. 示例
  • 在学习目录下,进入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
  1. 其它说明
    以二进制方式打开文件:rbwbabrb+wb+ab+
    除了加一个b选项,和普通的打开方式用法一样
    用途:打开图片、视频等文件

第3章 读取文件


  1. 语法
    read([size]):读取文件,可设置读取size个字节,默认全读
    readline([size]):默认(最多)读取一行,可设置读取size个字节(不超过1行)
    readlines([size]):默认读完文件,返回每一行组成的列表。设置size时,
       返回size / len(line)向上取整的行数。文件很大时不推荐该用法
    iter():使用迭代器读取文件
  2. 示例
  • 文件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章 写入文件


  1. 语法
    write(str):将字符串写入文件
    writelines(sequence_of_strings):写多行到文件,参数是可迭代对象
  2. 示例
  • 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
  1. 缓存机制
  • 写入文件后,不关闭,则数据在内核缓存区,磁盘文件依然为空,关闭文件时,内核才会把数据从缓存区保存到磁盘文件;
  • 当写入的数据量大于或等于缓存区时,内核会自动把缓存区的数据保存到磁盘文件,即缓存区满时,会自动整份地保存到磁盘文件,新写入的数据依然会停留在缓存区,直到缓存区再次满时,再自动整份地保存到磁盘文件;
  • 内核缓存区大小,可以通过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章 关闭文件


  1. 目的
  • 将缓存区数据同步到磁盘;
  • Linux系统中每个进程打开的文件个数是有限的;
  • 打开文件的数量达到了系统限制,再打开文件就会失败;
  • 特别提醒:打开一个文件,操作完成后,立即进行关闭。
  1. 示例(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章 文件指针


  1. Python读写文件存在的问题
  • 写入文件后,必须再次打开才能读取写入的内容;
  • 读取文件后,无法再次读取读过的内容;
  1. Python读写文件时,文件指针移动过程
    打开--读取--写入:3个圆点表示指针移动的过程,没有其它操作,无法使文件指针归位
  1. 文件指针操作
  • 语法
    seek(offset [, whence])
    offset:偏移量,可以为负数
    whence:偏移的相对位置
  • 相对位置
    os.SEEK_SET:相对文件的起始位置,值为0
    os.SEEK_CUR:相对文件的当前位置,值为1
    os.SEEK_END:相对文件的结束位置,值为2
  • 文件当前的偏移
    file.tell():返回文件当前的偏移量,为整数
  1. 示例
  • 已知文件: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章 文件属性


  1. 文件对象属性
  • 查看文件属性
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
  1. 标准文件
    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'>
  1. 文件命令行参数
    sys模块:提供sys.argv属性,获取文件命令行参数
    sys.argv属性:是字符串组成的列表,可以接受n个不同的参数

第8章 OS模块操作文件


  1. 基础函数
  • 打开文件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)
  1. 常用函数
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*
  1. 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章 练习


  1. 内容:使用Python管理ini文件:查询、添加、删除、保存

  2. 目的:掌握文件基本操作、认识ini文件、了解ConfigParser

  3. int文件格式:[session]:节、name = value :参数(键=值)。举例:
    [port]
    port1 = 8000
    port2 = 8001

  4. 示例

  • 查看当前目录下的ini文件:包含2个节user infostudy
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')]
  1. 项目实战:编写一个类,使用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')]
<========>

你可能感兴趣的:(Python中的文件处理)