Python语言文件处理 - 专题笔记
小标 2018-10-09 来源 : 阅读 887 评论 0

摘要:本文主要向大家介绍了Python语言文件处理 - 专题笔记,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

本文主要向大家介绍了Python语言文件处理 - 专题笔记,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。

任何语言都离不开对文件的操作,Python语言是如何来操作和管理文件的。掌握文件的基本概念、基本操作,了解文件属性、 linux 系统的文件管理机制及os模块对文件和目录的处理等相关内容。[√]慕课网Meshare_huang老师:Python文件处理文件简介Python的文件处理:初学者:推荐使用虚拟机VMwareStation + Deepin必备前置条件知识储备:Linux系统知识Linux下Python开发环境掌握Python基础知识Python文件概念:文件: Python中文件是对象依赖我们的具体系统。Linux文件:一切设备都可以看成文件例如:磁盘文件,管道,网络Socket,外设等。文件属性:用户,读,写,执行权限;在Linux控制台输入命令:#cd进一个空目录cd Desktop/ 
#创建一个文件夹mkdir PythonFile 
cd PythonFile 
touch hello.py
vim hello.pymark使用i进入insert模式进行插入代码。插入完成后使用esc退出编辑模式,输入:wq进行保存。markmark通过ls -l命令可以看到文件的一些基本属性:第一个横杠代表是一个文件,还是一个目录。-代表是一个文件,d代表是一个目录如下图1为一个目录。markmark第一组rw-代表当前用户对于当前文件有读有写没有执行权限。(-代表没有权限,x为可执行)第二组r--:表示当前用户组对该文件有读r 没有写w的权限,没有执行权限x第三组r--:表示其他用户对该文件有读r权限,但没有写w和执行x权限第一个mtianyan代表文件的拥有者是mtianyan第二个mtianyan 代表这个文件所属的用户组是mtianyan21代表文件的大小是21字节 后面的时间是文件的创建时间。后面是文件名。mark可以看到我们最为当前用户现在没有该文件执行权限。使用chmod为文件增加权限说明:如果给所有人添加可执行权限:chmod a+x 文件名;如果给文件所有者添加可执行权限:chmod u+x 文件名;如果给所在组添加可执行权限:chmod g+x 文件名;如果给所在组以外的人添加可执行权限:chmod o+x 文件名;mark可以看到我们通过chmod +x hello.py为当前用户,用户组,其他用户都添加了执行权限Linux下首行一定要加这句话:!/usr/bin/Python,!/usr/bin/Python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器。mark打印出了Helloworld好像有点问题。以后对Linux熟了再回来看。markpython命令是可以正常执行的。文件基础操作主要讲解文件打开及文件不同的打开方式、使用read,readlines及迭代器访问文件、文件写入方式及写缓存处理、文件关闭及由不关闭导致的问题、文件指针及文件指针操作文件打开方式open()open(name [,mode[buf]])name : 文件路径mode : 打开方式buf  : 缓冲buffering大小mode方式有:只读,只写。读写。read()read([size])读取文件(读取size个字节,默认读取全部)如果文件长度大于size,我们就读size个长度。如果文件长度小于size,我们就把文件读完。如果没有设置size,默认全部读完。readline()readline([size])读取一行readlines()readlines([size])读取完文件(看到后面你就知道并不是),返回每一行所组成的列表。我们就可以使用列表访问的方式,使用文件。弊端:一次性读完,占用很大内存。write()write(str)将字符串写入文件writelines()writelines(sequence_of_strings) : 写多行到文件sequence_of_strings是一个由字符型组成的列表。一次性写入多行。输入ipython进入ipython环境marktype(f)可以看到打开的文件类型就是一个文件对象。mark拥有的方法可以使用f. + Tab自动补齐markError:File not open for writing这里因为我们使用的是默认无参数打开,此时我们并不拥有写权限。Python文件打开方式mode说明说明'r'只读方式打开文件必须存在'w'只写方式打开文件不存在创建文件;存在则清空内容'a'追加方式打开文件不存在创建文件'r+'/'W+'读写方式打开'a+'追加和读写方式打开'rb','wb','ab','rb+','wb+','ab+':都是采用二进制方式打开。练习'r' 'w' 'a' 'r+'mark不带参数的open是用只读方式打开的,所以文件不存在会报错。mark请注意关闭文件f.close()否则cat时文件内容会为空。mark当我们再次打开文件使用w方式。已存在的文件会被清空才打开。mark我们以a方式打开此时我们可以对于文件进行追加操作,原有内容并没有被清空新增内容被添加到了最后。mark当我们以r+方式打开,我们新增的内容会从文件开始替换原有内容的一部分。mark当我们以w+方式打开,文件可以被读写。但是文件内容被清空。mark此时新文件可以被读写。使用二进制方式打开的使用方法与上面介绍的基本一致。意义在于: 比如读取一张图片的EXIF信息读取图片的长宽拍照日期如果我们以普通方式打开是以文本方式打开,不能读取到正确的内容。当我们以二进制打开我们就可以读取到正确的EXIF信息。学习了打开文件,读取文件,写入文件。文件打开方式的不同。文件读取方式read()read([size])读取文件(读取size个字节,默认读取全部)如果文件长度大于size,我们就读size个长度。如果文件长度小于size,我们就把文件读完。如果没有设置size,默认全部读完。readline()readline([size])读取一行示例操作首先使用touch mtianyan.txt 和 vi mtianyan.txt创建并写入内容:blog.mtianyan.cnblog.mtianyan.cnblog.mtianyan.cnmark可以看出readline(size):    if len(line) > size:        return size    if len(line) < size:        return len(line)readlines()readlines([size])读取完文件(整数个buffer左右字节),返回每一行所组成的列表。我们就可以使用列表访问的方式,使用文件。弊端:一次性读完,占用很大内存。示例操作:mark虽然设置了size为1,但是还是把所有都读出来了。mark输入help(f.readlines)查看定义:重复的调用readline()然后返回一个读到的行所组成的列表。读取文件的大小:如果size小于缓冲区的大小,则读取缓冲区大小的数据如果size大于缓冲区的大小,读取size大小的数据,但不是完全的等于size的大小,一般读取比size大的整行的数据.这个设置是python解释器内部的一个变量。import io
io.DEFAULT_BUFFER_SIZEmark设置参数小于8192每次能读取8192个字节。设置参数大于一个8192小于2*8192=16384。则读取两个buffer值.BUFFER都是一整个一整个读Linux命令使用使用vi打开文件。y是复制当前行,yy是复制光标所在的一整行.如果复制了一行,则p是在光标所在行的下一行粘贴,10000p就是粘贴10000次命令yy,10000p复制10000行 .然后:set nu 显示行数gg:跳转到文件头 :1 或 gg跳转到文件末尾行数+gg :$ Shift+g跳转到指定行,例跳转到123行:123gg或:123.使用ctrl+z可将程序切换到后台。用fg可将后台程序切换到前台。mark可以看到此时的文件以及有十几万个字节了mark可以看出这时候不再是一次性把文件读取完了,而是读取了482行。170051/100003行,每行17个字节。mark这时我们的size大于了缓冲区的大小8192。因此我们的size到了8192和16384之间。重点:系统数据是按着整个buffer,整个buffer来读的。此时系统会读取差不多两个buffer的数据。也就是963*17 =16371 。待探究iter: 使用迭代器读取文件mark迭代器并不是把我们的文件全部存入了内存中。而是我们每使用一次next方法就会自动读取下一行。所以能在不消耗大量内存的情况下进行读取整个文件。文件写入与写缓存write()write(str)将字符串写入文件writelines()writelines(sequence_of_strings) : 写多行到文件sequence_of_strings参数是一个可迭代对象:可以是字符串可以是字符串所组成的元组。可以是一个字符串所组成的迭代器。也可是一个字符串组成的列表实际操作markIn [37]: cat test.txt
test write
In [38]: f = open("mtianyan.txt",'w')
In [39]: f.writelines('123456')
In [40]: f.writelines((1,2,3))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in ()
----> 1 f.writelines((1,2,3))

TypeError: writelines() argument must be a sequence of strings写入一个元组会报错 :提示必须是由字符串组成的序列。In [41]: f.writelines(('1','2','3'))
In [42]: f.writelines(['1','2','3'])
In [43]: f.close()
In [44]: cat test.txt
test write
In [45]: cat mtianyan.txt123456123123可以看到我们都可以正常的写入由字符串组成的列表。In [46]: f = open("mtianyan.txt",'w')
In [47]: f.write("11111")
In [48]: cat mtianyan.txt

In [49]:文件内容为空,因为我们没有使用f.close()将文件关闭。Linux系统有一种写缓存机制。如果我们不主动调用f.close()或 flush他是不会写到磁盘文件的。mark写文件的过程中Python解释器进行系统调用。Linux系统内核将文件写入系统文件缓冲区。当我们调用f.close()时,系统会更新文件到硬盘。Python写磁盘的缓存机制主动调用closed()或flush方法。写缓存同步到磁盘写入数据量大于或等于写缓存,写缓存同步到磁盘。(此时系统写缓存又清空,然后就又继续缓存直到close())实际操作In [62]: f = open("mtianyan.txt",'w')
In [63]: f.write('test write')
In [64]: cat mtianyan.txt
In [65]: f.flush()
In [66]: cat mtianyan.txt
test write进行flush()操作时内容更新。markmark说明我的Linux的缓冲区就是这么大147456当我们执行close文件会变大。因为全部写进去了。文件关闭将写缓存同步到磁盘;linux系统中每个进程打开的文件个数是有限的;如果打开文件数到了系统限制,在打开文件就会失败;mtianyan@mtianyan-deep:~/Desktop/PythonFile$ ps
   PID TTY          TIME CMD  5587 pts/1    00:00:00 bash  5918 pts/1    00:00:02 ipython看到ipython进程:mtianyan@mtianyan-deep:~/Desktop/PythonFile$ cat /proc/5918/limits 
Limit                     Soft Limit           Hard Limit           Units     
Max open files            1024                 1048576              filesfile.fileno():文件描述符;每打开一个就会加1,直到1024失败n [3]: for i in range(1027):
   ...:     f = open("mtianyan.txt",'r')
   ...:     print ("%d:%d" %(i,f.fileno()))mark并没有起到效果。fileno在10和12不断来回实现代码:In [11]: for i in range(1025):
    ...:     list_f.append(open("mtianyan.txt",'w'))
    ...:     print ("%d:%d" %(i,list_f[i].fileno()))
    ...:运行结果:1010:1022---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
 in ()
      1 for i in range(1025):
----> 2     list_f.append(open("mtianyan.txt",'w'))      3     print ("%d:%d" %(i,list_f[i].fileno()))      4 IOError: [Errno 24] Too many open files: 'mtianyan.txt'因此我们需要养成良好编码习惯记得关闭文件。文件指针。写入文件后,必须打开才能读取写入的内容读取文件后,无法重新再次读取读取过的内容比如:写完文件必须关闭才能读到我们写入的内容。文件指针用于定位我们当前文件所执行到的位置:使用open()打开时文件指针就在起始位置。read(3)文件指针就会往后挪3个位置。指向第四个位置。write('mtianyan')就会从当前文件指针4开始写。文件指针就会移动8个字节。我们之前的问题都是因为我们无法使文件指针归于起始位置的,下面我们学习自由操作文件指针:seek(offset[,whence]):移动文件指针
    offset 偏移量,可以为负数
    whence:偏移相对位置:
os.SEEK_SET:相对文件的起始位置0os,SEEK_CUR:相对文件的当前位置1os.SEEK_END:相对文件的结尾位置2In [1]: f = open('mtianyan.txt','r+')
In [2]: import os
In [3]: f.tell() 
Out[3]: 0f.tell()(函数)返回当前文件的偏移返回的是一个整数,也许是一个长整数In [4]: f.read(3)
Out[4]: 'tes'In [5]: f.tell()
Out[5]: 3In [6]: f.seek(0, os.SEEK_SET)
In [7]: f.tell()
Out[7]: 0可以看出我们可以使用f.seek(0, os.SEEK_SET)来进行指针归零。In [8]: f.seek(0,os.SEEK_END)
In [9]: f.tell()
Out[9]: 3139In [10]: ls -l mtianyan.txt
-rw-r--r-- 1 mtianyan mtianyan 3139 1月   6 03:58 mtianyan.txt
In [11]: f.read(5)
Out[11]: ''当然我们也可以把文件指针指到末尾去。文件指针已经在末尾了,向后继续读取会为空。In [12]: f.seek(-5,os.SEEK_END)
In [13]: f.read(5)
Out[13]: '231\n\n'使用f.seek(-5,os.SEEK_END)可以将文件指针倒着移回去。In [14]: f.tell()Out[14]: 3139In [15]: f.seek(-5,os.SEEK_CUR)In [16]: f.tell()Out[16]: 3134读取5个之后,指针又跑到了3139:使用f.seek(-5,os.SEEK_CUR)又可以从当前位置往前移。当文件偏移大于文件长度会出现的问题:In [17]: f.seek(0,os.SEEK_END)In [18]: f.tell()Out[18]: 3139In [19]: f.seek(-3140,os.SEEK_END)---------------------------------------------------------------------------IOError                                   Traceback (most recent call last)
 in ()----> 1 f.seek(-3140,os.SEEK_END)IOError: [Errno 22] Invalid argument会报错:告诉我们这是一个无效的参数。类似于索引越界等。文件属性及OS模块使用讲解文件属性、标准文件、文件命令行参数、文件编码格式、使用os模块中方法对文件进行操作、使用os模块中的方法对目录进行操作文件属性编码格式Python文件属性file.fileno():文件描述符;每打开一个就会加1,直到1024失败file.mode:文件打开权限file.encoding:文件编码格式file.closed:文件是否关闭In [20]: f.fileno()
Out[20]: 12In [21]: f.closed
Out[21]: FalseIn [22]: f.mode
Out[22]: 'r+'In [23]: f.encoding没有返回值:为ASCII码文件。应该与系统相关。Python标准文件文件标准输入:sys.stdin;文件标准输出:sys.stdout;文件标准错误:sys.stderr;In [26]: import sys
In [27]: type(sys.stdin)
Out[27]: file
In [28]: sys.stdin.mode
Out[28]: 'r'In [29]: sys.stdin.read()系统的sys.stdin的read()是指从控制台读入数据。In [32]: sys.stdin.fileno()Out[32]: 0系统的sys.stdin的fileno为0。也就是我们启动一个进程,他首先会打开标准输入:从控制台读数据。a = raw_input() 其实内部是调用sys.stdin来读取数据的。In [37]: sys.stdout.mode
Out[37]: 'w'In [38]: sys.stdout.write("1000")1000sys.stdout只可以写,不可以读。写入相当于写入到控制台,会直接显示。print实际内部调用的是stdoutIn [39]: sys.stdout.fileno()Out[39]: 1sys.stdout是系统在启动程序时第二个打开的。也就是系统会先为我们打开输入,再打开输出。In [40]: sys.stderr.mode
Out[40]: 'w'In [41]: sys.stderr.write("error")
error
In [42]: sys.stderr.fileno()
Out[42]: 2sys.stderr是系统在启动程序时第二个打开的。先开输入,再开输出。第三err输出。Python文件命令行参数sys模块提供了sys.argv,通过该属性可以得到命令行参数很多程序都是这么做的:比如加上-v,根据不同的参数完成不同的功能。sys.argv是一个字符串组成的列表import sysif __name__ == '__main__':    print len(sys.argv)    for arg in sys.argv:        print arg运行结果:1
D:\mtianBlog\hexoBlog-Github\source\_posts\test.py直接运行,我们没有提供参数,打印出了当前文件的绝对路径文件名。Python文件编码方式。使用普通方式打开文件:写入u天涯明月笙。In [3]: f.write(u'天涯明月笙')
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
 in ()----> 1 f.write(u'天涯明月笙')UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)会报错:UnicodeEncodeError因为我们的文件是ascii格式的。不能将Unicode字符串写入。实现代码:In [1]: a = unicode.encode(u'天涯','utf-8')
In [2]: a
Out[2]: '\xe5\xa4\xa9\xe6\xb6\xaf'In [3]: f.write(a)运行结果:In [7]: cat mtianyan.txt天涯我们可以用codecs模块提供方法创建制定编码格式文件.import codecs
f = codecs.open('test.txt','w','utf-8')
f.encodingopen(fname,mode,encoding,errors,buffering):使用指定编码格式打开文件linux文件系统所有设备都可以看为文件:包括磁盘(ext2,ext4)文件,NFS文件系统,各种外设mark虚拟文件系统为文件提供文件节点每一个外设在内核中都有一个对应的驱动程序。通过系统调用对文件节点进行访问。把所有外设作为文件处理。mark在操作系统之上的Python解释器,Python程序跑在解释器中。mark使用open()会访问文件节点。设备节点对应虚拟文件系统的方法,这个文件系统与驱动绑定。驱动会操作硬件设备。os模块对文件和目录进行操作使用os模块来打开文件:os.open(filename, flag [,mode])打开文件- os.O_CREAT:创建文件- os.O_RDONLY:只读方式打开- os.O_WRONLY:只写方式打开- os.O_RDWR:读写方式打开os.read(fd, buffersize):读取文件,返回值为读取的内容os.write(fd, string):写入文件 ,返回值是写入数据的大小os.lseek(fd, pos, how): 文件指针操作os.close(fd):关闭文件umask获取系统的默认权限。我的是0022In [14]:fd = os.open('mtianyan.txt',os.O_CREAT | os.O_RDWR)
In [15]: n = os.write(fd,"mtianyan")
In [16]: n
Out[16]: 8In [17]: os.lseek(fd,0,os.SEEK_SET)
Out[17]: 0In [18]: os.read(fd,5)
Out[18]: 'mtian'Out[19]: os.close()使用os是为了跨平台。os方法os方法说明os.access(path, mode)判断该文件权限:F_OK存在,权限:R_OK ,W_OK, X_OKos.listdir(path)返回当path路径下所有文件名组成的列表os.remove(path)删除文件os.rename(old, new)修改文件或者目录名os.mkdir(path[, mode])创建目录os.makedirs(path[, mode])创建多级目录os.removedirs(path)删除多级目录os.rmdir(path)删除目录(目录必须空目录)os.access('mtianyan,txt',os.R_OK)
os.listdir('./')
os.rename('test/','test1')os.path方法os.path方法说明os.path.exists(path)当前路径是否存在,也可以判断是否有该文件os.path.isdir(s)是否是一个目录os.path.isfile(path)是否是一个文件os.path.getsize(filename)返回文件大小,返回目录文件大小os.path.dirname(p)返回路径的目录os.path.basename(p)返回路径的文件名os.path.exists('./mtianyan.txt')# Trueos.path.isdir('./'')
# True
os.path.isdir('mtianyan.txt')
# False
os.path.isfile('mtianyan.txt')
# True文件练习使用Python来管理ini文件:实现查询,添加,删除,保存。掌握文件的基本操作认识ini文件了解ConfigPaserini配置文件格式:节: [session]
参数(键=值)  name=value

[port]
    port1 = 800
    port2 = 900定位带port这个节,然后找到。ConfigParsermtianyan.txt内容:[userinfo]
name = mtianyanpwd = abc

[study]
python = 15
java_base = 20两个概念:sections(大的分类)和option小的选项import ConfigParser
cfg = ConfigParser.ConfigParser()

help(cfg.read)

cfg.read('mtianyan.txt')# ['mtianyan.txt']cfg.sections() #返回节点值:userinfo,study# ['userinfo', 'study']for se in cfg.sections():    print se    print cfg.items(se)#遍历出整个文件遍历结果如下userinfo
[('name', 'johntian'), ('pwd', 'abc')]
study
[('python_base', '15'), ('python_junior', '20'), ('linux_base_', '15')]cfg.set('userinfo', 'pwd', '1234567')     #修改键值cg.set('userinfo','email','1147727180.com')//增加键值

cfg.remove_option('user info','email')  //删除键值文件操作练习import osimport ConfigParser'''
1: dump ini
2: del section
3: del item
4: modify item
5: add section
6: save modify

'''class student_info(object):

    def __init__(self, recordfile):
        self.logfile = recordfile
        self.cfg = ConfigParser.ConfigParser()    def cfg_load(self):
        self.cfg.read(self.logfile)    def cfg_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, sescion):
        self.cfg.remove_option(section)    def add_section(self, section):
        self.cfg.add_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()if __name__ == '__main__':
    info = student_info('mtianyan.txt')
    info.cfg_load()
    info.cfg_dump()
    info.add_section('userinfo')
    info.set_item('userinfo', 'pwd', 'abc')
    info.cfg_dump()
    info.add_section('login')
    info.set_item('login', '2018-0106', '20')
    info.cfg_dump()
    info.save()运行结果:**********************>
**********************>
userinfo
[('pwd', 'abc')]
<*********************
**********************>
userinfo
[('pwd', 'abc')]
<*********************
login
[('2018-0106', '20')]
<*********************
[Finished in 0.3s]    

本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程