python之文件对象

2023-01-31 03:01:27 python 文件 对象

防伪码忘情公子著


文件对象是用来访问文件系统接口所对应的数据的

文件系统是OS用于明确磁盘或分区上的文件的方法和数据结构—即在磁盘上组织文件的方法

计算机文件或称文件、电脑档案、档案是存储在某种长期储存设备或临时存储设备中的一段数据流并且归属于计算机文件系统管理之下

概括来讲

        文件是计算机中由OS管理的具有名字的存储区域

        在linux系统上文件被看做是字节序列

wKiom1hU9w-jYLj5AAC2K7fvLZ8039.png


要想把数据存储到文件中有一个前提那就是必须序列化,非序列化的数据是不能简单的存储在文件系统中的文件中的


对于python来说文件对象不仅可以用来访问普通的磁盘文件此外在Linux中的一些特殊文件比如套接字文件、命名管道等等也都可以通过文件的对象接口来进行访问。


对于Python而言要想实现创建文件对象就要使用python的内置函数open()来完成。

python的内置函数open()用于打开文件和创建文件对象其使用方法如下

open(name [,mode [,bufsize]])

open函数可以接收三个参数文件名、模式和缓冲区参数。open函数返回的是一个文件对象

 mode指定文件的打开模式

     简单模式

       r只读

       w写入

       a附加

     在模式后使用“+”表示同时支持输入、输出操作

       r+

       w+

       a+

     在模式后附加“b”表示以二进制方式打开

       如rb、wb+

     当以可写模式打开文件时若文件不存在则会创建该文件

     当以只读模式打开文件时若文件不存在则会发出异常

  bufsize定义输出缓存

   0表示无输出缓存禁用缓冲

   1表示使用缓冲只缓冲一行数据

   负数表示使用系统默认设置使用系统默认缓冲

   正数表示使用近似指定大小的缓冲指定缓冲空间大小


文件对象的方法

file.next()方法 以迭代方式获取文件的所有行

In [1]: f = open('/etc/passwd')

In [2]: f.next()
Out[2]: '##\n'

In [3]: f.next()
Out[3]: '# User Database\n'

In [4]: f.next()
Out[4]: '# \n'

In [5]: f.next()
Out[5]: '# Note that this file is consulted directly only when the system is running\n'

In [6]: f.next()
Out[6]: '# in single-user mode.  At other times this infORMation is provided by\n'

In [7]: f.next()
Out[7]: '# Open Directory.\n'

In [8]: f.next()
Out[8]: '#\n'

In [9]: f.next()
Out[9]: '# See the opendirectoryd(8) man page for additional information about\n'

In [10]: f.next()
Out[10]: '# Open Directory.\n'

In [11]: f.next()
Out[11]: '##\n'

In [12]: f.next()
Out[12]: 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false\n'

In [13]: f.next()
Out[13]: 'root:*:0:0:System Administrator:/var/root:/bin/sh\n'

In [14]: f.next()
Out[14]: 'daemon:*:1:1:System Services:/var/root:/usr/bin/false\n'

In [15]: f.next()
Out[15]: '_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico\n'


file.close()方法关闭文件被关闭的文件无法再从中读取数据

In [24]: f.close()

In [25]: f.next()
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-25-c3e65e5362fb> in <module>()
----> 1 f.next()

ValueError: I/O operation on closed file


file.fileno()方法返回文件对象的文件描述符

In [27]: f = open('/etc/passwd')

In [28]: f.fileno()
Out[28]: 10


file.readline()方法执行一次返回一行

In [30]: f = open('/etc/passwd')

In [31]: f.readline()
Out[31]: '##\n'

In [32]: f.readline()
Out[32]: '# User Database\n'

In [33]: f.readline()
Out[33]: '# \n'


file.readlines()方法以列表模式返回文件所有行

In [34]: f = open('/etc/passwd')

In [35]: f.readlines()
Out[35]:
['##\n',
 '# User Database\n',
 '# \n',
 '# Note that this file is consulted directly only when the system is running\n',
 '# in single-user mode.  At other times this information is provided by\n',
 '# Open Directory.\n',
 '#\n',
 '# See the opendirectoryd(8) man page for additional information about\n',
 '# Open Directory.\n',
 '##\n',
 'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false\n',
 'root:*:0:0:System Administrator:/var/root:/bin/sh\n',
 'daemon:*:1:1:System Services:/var/root:/usr/bin/false\n',
 '_uucp:*:4:4:Unix to Unix Copy Protocol:/var/spool/uucp:/usr/sbin/uucico\n',
 '_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false\n',
 '_networkd:*:24:24:Network Services:/var/networkd:/usr/bin/false\n',
 '_installassistant:*:25:25:Install Assistant:/var/empty:/usr/bin/false\n',
 '_lp:*:26:26:Printing Services:/var/spool/cups:/usr/bin/false\n',
 '_postfix:*:27:27:Postfix Mail Server:/var/spool/postfix:/usr/bin/false\n',
 '_scsd:*:31:31:Service Configuration Service:/var/empty:/usr/bin/false\n',
 '_ces:*:32:32:Certificate Enrollment Service:/var/empty:/usr/bin/false\n',
 '_mcxalr:*:54:54:MCX AppLaunch:/var/empty:/usr/bin/false\n',
 '_appleevents:*:55:55:AppleEvents Daemon:/var/empty:/usr/bin/false\n',
 '_geod:*:56:56:Geo Services Daemon:/var/db/geod:/usr/bin/false\n',
 '_serialnumberd:*:58:58:Serial Number Daemon:/var/empty:/usr/bin/false\n',
 '_devdocs:*:59:59:Developer Documentation:/var/empty:/usr/bin/false\n',
 '_sandbox:*:60:60:Seatbelt:/var/empty:/usr/bin/false\n',
 '_mdnsresponder:*:65:65:mDNSResponder:/var/empty:/usr/bin/false\n',
 '_ard:*:67:67:Apple Remote Desktop:/var/empty:/usr/bin/false\n',
 '_www:*:70:70:World Wide WEB Server:/Library/WebServer:/usr/bin/false\n',
 '_eppc:*:71:71:Apple Events User:/var/empty:/usr/bin/false\n',
 '_cvs:*:72:72:CVS Server:/var/empty:/usr/bin/false\n',
 '_svn:*:73:73:SVN Server:/var/empty:/usr/bin/false\n',
 '_Mysql:*:74:74:mysql Server:/var/empty:/usr/bin/false\n',
 '_sshd:*:75:75:sshd Privilege separation:/var/empty:/usr/bin/false\n',
 '_Qtss:*:76:76:QuickTime Streaming Server:/var/empty:/usr/bin/false\n',
 '_cyrus:*:77:6:Cyrus Administrator:/var/imap:/usr/bin/false\n',
 '_mailman:*:78:78:Mailman List Server:/var/empty:/usr/bin/false\n',
 '_appserver:*:79:79:Application Server:/var/empty:/usr/bin/false\n',
 '_clamav:*:82:82:ClamAV Daemon:/var/virusmails:/usr/bin/false\n',
 '_amavisd:*:83:83:AMaViS Daemon:/var/virusmails:/usr/bin/false\n',
 '_jabber:*:84:84:Jabber XMPP Server:/var/empty:/usr/bin/false\n',
 '_appowner:*:87:87:Application Owner:/var/empty:/usr/bin/false\n',
 '_windowserver:*:88:88:WindowServer:/var/empty:/usr/bin/false\n',
 '_spotlight:*:89:89:Spotlight:/var/empty:/usr/bin/false\n',
 '_tokend:*:91:91:Token Daemon:/var/empty:/usr/bin/false\n',
 '_securityagent:*:92:92:SecurityAgent:/var/db/securityagent:/usr/bin/false\n',
 '_calendar:*:93:93:Calendar:/var/empty:/usr/bin/false\n',
 '_teamsserver:*:94:94:TeamsServer:/var/teamsserver:/usr/bin/false\n',
 '_update_sharing:*:95:-2:Update Sharing:/var/empty:/usr/bin/false\n',
 '_installer:*:96:-2:Installer:/var/empty:/usr/bin/false\n',
 '_atsserver:*:97:97:ATS Server:/var/empty:/usr/bin/false\n',
 '_ftp:*:98:-2:FTP Daemon:/var/empty:/usr/bin/false\n',
 '_unknown:*:99:99:Unknown User:/var/empty:/usr/bin/false\n',
 '_softwareupdate:*:200:200:Software Update Service:/var/empty:/usr/bin/false\n',
 '_coreaudiod:*:202:202:Core Audio Daemon:/var/empty:/usr/bin/false\n',
 '_screensaver:*:203:203:Screensaver:/var/empty:/usr/bin/false\n',
 '_locationd:*:205:205:Location Daemon:/var/db/locationd:/usr/bin/false\n',
 '_trustevaluationagent:*:208:208:Trust Evaluation Agent:/var/empty:/usr/bin/false\n',
 '_timezone:*:210:210:AutoTimeZoneDaemon:/var/empty:/usr/bin/false\n',
 '_lda:*:211:211:Local Delivery Agent:/var/empty:/usr/bin/false\n',
 '_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false\n',
 '_usbmuxd:*:213:213:iPhone OS Device Helper:/var/db/lockdown:/usr/bin/false\n',
 '_dovecot:*:214:6:Dovecot Administrator:/var/empty:/usr/bin/false\n',
 '_dpaudio:*:215:215:DP Audio:/var/empty:/usr/bin/false\n',
 '_postgres:*:216:216:postgresql Server:/var/empty:/usr/bin/false\n',
 '_krbtgt:*:217:-2:Kerberos Ticket Granting Ticket:/var/empty:/usr/bin/false\n',
 '_kadmin_admin:*:218:-2:Kerberos Admin Service:/var/empty:/usr/bin/false\n',
 '_kadmin_changepw:*:219:-2:Kerberos Change PassWord Service:/var/empty:/usr/bin/false\n',
 '_devicemgr:*:220:220:Device Management Server:/var/empty:/usr/bin/false\n',
 '_webauthserver:*:221:221:Web Auth Server:/var/empty:/usr/bin/false\n',
 '_netbiOS:*:222:222:NetBIOS:/var/empty:/usr/bin/false\n',
 '_warmd:*:224:224:Warm Daemon:/var/empty:/usr/bin/false\n',
 '_dovenull:*:227:227:Dovecot Authentication:/var/empty:/usr/bin/false\n',
 '_netstatistics:*:228:228:Network Statistics Daemon:/var/empty:/usr/bin/false\n',
 '_avbdeviced:*:229:-2:Ethernet AVB Device Daemon:/var/empty:/usr/bin/false\n',
 '_krb_krbtgt:*:230:-2:Open Directory Kerberos Ticket Granting Ticket:/var/empty:/usr/bin/false\n',
 '_krb_kadmin:*:231:-2:Open Directory Kerberos Admin Service:/var/empty:/usr/bin/false\n',
 '_krb_changepw:*:232:-2:Open Directory Kerberos Change Password Service:/var/empty:/usr/bin/false\n',
 '_krb_kerberos:*:233:-2:Open Directory Kerberos:/var/empty:/usr/bin/false\n',
 '_krb_anonymous:*:234:-2:Open Directory Kerberos Anonymous:/var/empty:/usr/bin/false\n',
 '_assetcache:*:235:235:Asset Cache Service:/var/empty:/usr/bin/false\n',
 '_coremediaiod:*:236:236:Core Media IO Daemon:/var/empty:/usr/bin/false\n',
 '_launchservicesd:*:239:239:_launchservicesd:/var/empty:/usr/bin/false\n',
 '_iconservices:*:240:240:IconServices:/var/empty:/usr/bin/false\n',
 '_distnote:*:241:241:DistNote:/var/empty:/usr/bin/false\n',
 '_nsurlsessiond:*:242:242:NSURLSession Daemon:/var/db/nsurlsessiond:/usr/bin/false\n',
 '_nsurlstoraged:*:243:243:NSURLStorage Daemon:/var/empty:/usr/bin/false\n',
 '_displaypolicyd:*:244:244:Display Policy Daemon:/var/empty:/usr/bin/false\n',
 '_astris:*:245:245:Astris Services:/var/db/astris:/usr/bin/false\n',
 '_krbfast:*:246:-2:Kerberos FAST Account:/var/empty:/usr/bin/false\n',
 '_gamecontrollerd:*:247:247:Game Controller Daemon:/var/empty:/usr/bin/false\n',
 '_mbsetupuser:*:248:248:Setup User:/var/setup:/bin/bash\n',
 '_ondemand:*:249:249:On Demand Resource Daemon:/var/db/ondemand:/usr/bin/false\n',
 '_xserverdocs:*:251:251:OS X Server Documents Service:/var/empty:/usr/bin/false\n',
 '_wwwproxy:*:252:252:WWW Proxy:/var/empty:/usr/bin/false\n']

由于readlines是一次性获取所有行若文件数据特别多将会极其占用内存资源所以一般不用readlines如果需要读取文件所有行可以使用readline进行迭代获取

当readline读取到文件末尾时再执行readline时将返回一个空字符串

In [1]: f = open('/Users/seancheng/aa.txt')

In [2]: f.readline()
Out[2]: 'fadjlfjdakf\n'

In [3]: f.readline()
Out[3]: '213242345\n'

In [4]: f.readline()
Out[4]: 'fjdagu8908fa\n'

In [5]: f.readline()
Out[5]: 'fdaf343435\n'

In [6]: f.readline()
Out[6]: 'fadgjljl;8\n'

In [7]: f.readline()
Out[7]: 'fjadljg5\n'

In [8]: f.readline()
Out[8]: ''

In [9]: f.readline()
Out[9]: ''


file.tell()方法返回当前指针在文件中的位置。以字节为单位如下表示指针在第66个字节的位置上

In [10]: f.tell()
Out[10]: 66


file.seek()方法定义文件指针的位置其使用方法如下

seek(offset[, whence])

offset指定偏移量

whence指定从哪里开始偏移

        0表示从文件头开始偏移

        1表示从当前位置开始偏移

        2表示从文件尾部开始偏移

In [13]: f.tell()
Out[13]: 66

In [14]: f.seek(0)

In [15]: f.tell()
Out[15]: 0

如上所示若不给whence的话默认的从文件头开始偏移


file.read()方法明确指定从文件中指定要读取多少个字节结果返回成一个字符串

例读取10个字节

In [16]: f.read(10)
Out[16]: 'fadjlfjdak'

In [17]: f.tell()
Out[17]: 10

当不指定字节数时将读取整个文件

In [1]: f = open('/Users/seancheng/aa.txt')

In [2]: f.tell()
Out[2]: 0

In [3]: f.read()
Out[3]: 'fadjlfjdakf\n213242345\nfjdagu8908fa\nfdaf343435\nfadgjljl;8\nfjadljg5\n'

In [4]: f.tell()
Out[4]: 66


file.name属性直接调用当前文件的全路径名称

In [6]: f.name
Out[6]: '/Users/seancheng/aa.txt'


file.write(s)写入字符串s

file.writelines(lines)写入序列lines中的所有字符串只能将字符串序列写入到文件中

file.flush()刷新缓冲区手动同步数据到磁盘中

file.truncate([size])将文件截断为最多size字节也就是说文件被截取后只剩下size字节

file.closed返回当前文件是否为关闭状态

file.encoding返回当前文件使用的编码

file.mode返回当前文件的打开模式


这就是python中的文件对象仅以此篇作为python学习成长记录。

相关文章