Python文件对象
明确文件系统:
- 获取文件对象:
var_name = open(file_name[mode,[bufsize]])
缓冲:
0:禁用
1:使用缓冲,只缓冲一行数据
2+:指定缓存空间大小
负数:使用系统默认缓冲区
- 文件对象的内置方法、函数、属相
next:
In [10]: f1 = open('/etc/passwd','r')
In [11]: type(f1)
Out[11]: file
In [12]: f1.next()
Out[12]: 'root:x:0:0:root:/root:/bin/bash\n'
In [13]: f1.next()
Out[13]: 'bin:x:1:1:bin:/bin:/sbin/nologin\n'
In [14]: f1.next()
Out[14]: 'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n'
close:
In [35]: f1.close()
fileno 返回文件描述符
In [38]: f1 = open('/etc/passwd','r')
In [39]: f1.fileno()
Out[39]: 8
readline,readlines
返回字符串对象
In [40]: f1.readline()
Out[40]: 'root:x:0:0:root:/root:/bin/bash\n'
返回文件所有行为列表对象:
In [41]: f1.readlines()
Out[41]:
['bin:x:1:1:bin:/bin:/sbin/nologin\n',
'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n',
'mail:x:8:12:mail:/var/spool/mail:/sbin/nologin\n',
'nobody:x:99:99:Nobody:/:/sbin/nologin\n']
tell:游标在文件中的位置,字节
In [47]: f1.tell()
Out[47]: 951
file.seek(offset[whence])
whence:起点
0:从文件头偏移,默认
1:从当前位置偏移
2:从文件尾部偏移
In [48]: f1.tell()
Out[48]: 951
In [49]: f1.seek(0)
In [50]: f1.tell()
Out[50]: 0
file.read([size])
file.read([size]) 读取多少个字节
In [51]: f1.read(10)
Out[51]: 'root:x:0:0'
此时在readline,或next读取的是位置到行尾
In [52]: f1.readline()
Out[52]: ':root:/root:/bin/bash\n'
file.write打开文件保存数据
In [61]: cp /etc/passwd .
In [62]: ls
passwd
In [64]: f1 = open('passwd','r+')
In [65]: f1.next()
Out[65]: 'root:x:0:0:root:/root:/bin/bash\n'
I [66]: f1.seek(0,2)
In [67]: f1.tell()
Out[67]: 951
In [68]: f1.write('new line.\n')
In [69]: f1.tell()
Out[69]: 961
In [70]: cat passwd
root:x:0:0:root:/root:/bin/bash
mysql:x:306:306::/home/mysql:/bin/bash
new line.
In [71]: f1.close()
In [72]: f2 = open('new_file','w+')
In [73]: f2.write('Python')
In [74]: f2.close()
In [75]: cat new_file
Python
读模式打开不存在文件,报IOError
In [76]: f3 = open('new_file2','r+')
---------------------------------------------------------------------------
IOError Traceback (most recent call last)
<ipython-input-76-1d0d8a99b4f2> in <module>()
----> 1 f3 = open('new_file2','r+')
IOError: [Errno 2] No such file or directory: 'new_file2'
In [77]: f3 = open('new_file2','a')
In [78]: ls
new_file new_file2 passwd
writelines(...)
writelines(sequence_of_strings) -> None. Write the strings to the file.
Note that newlines are not added. The sequence can be any iterable object
producing strings. This is equivalent to calling write() for each string
In [13]: f4 = open('new_file4','w+') In [14]: import os In [15]: l4 = os.listdir(‘/etc’)
返回列表对象:
In [19]: f4.writelines(l4)
In [20]: f4.flush()
可以看到,writelines把列表中多有对象当成一个字符串写入文件,没有换行
下面进行手动换行:
重新生成列表,添加换行符:
In [23]: l4 = [i+'\n' for i in os.listdir('/etc')]
In [25]: f4 = open('new_file4','w+') In [26]: f4.writelines(l4) In [27]: f4.flush() In [28]: f4.close()
isatty()判断是不是终端
In [52]: f3 = open('new_file3','r+') In [53]: f3.isatty() Out[53]: False
truncate(N)截取保留N个字节:
In [55]: f3.readline()
Out[55]: 'root:x:0:0:root:/root:/bin/bash\n'
In [56]: f3.readline()
Out[56]: 'bin:x:1:1:bin:/bin:/sbin/nologin\n'
In [57]: f3.readline()
Out[57]: 'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n'
截取保留当前游标位置及之前字节数
In [58]: f3.truncate(f3.tell())
In [59]: f3.flush()
In [60]: f3.seek(0)
In [61]: f3.readlines()
Out[61]:
['root:x:0:0:root:/root:/bin/bash\n',
'bin:x:1:1:bin:/bin:/sbin/nologin\n',
'daemon:x:2:2:daemon:/sbin:/sbin/nologin\n']
closed 属性,判断文件打开状态
In [62]: f4.closed Out[62]: False
file.name属性
In [53]: f1.name Out[53]: '/etc/passwd'
mode文件打开模式,另外还有encoding、softspace等。
file.close file.flush file.next file.seek file.writelines
file.closed file.isatty file.read file.softspace file.xreadlines
file.encoding file.mode file.readinto file.tell
file.errors file.name file.readline file.truncate
file.fileno file.newlines file.readlines file.write
- 练习
1、1-10的平方写进文件new_file3,一次写一个对象
2、上面writelines方法,写入/etc下所有文件名到文件。
In [7]: f3 = open('new_file3','w+')
In [8]: for line in (i**2 for i in range(1,11)):
...: f3.write(str(line)+'\n')
...:
In [9]: f3.flush()
In [10]: f3.close()
In [11]: cat new_file3
1
4
9
16
25
36
49
64
81
100