标签:ota 语法 lin 重命名 多个 无法 sans 微软 bytes
内建函数open提供了初始化输入/输出(I/O)操作的通用接口。open()内建函数成功打开文件后会返回一个文件对象。open函数的语法如下:
open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
In [5]: f = open(‘file.txt‘)
In [6]: f
Out[6]: <_io.TextIOWrapper name=‘file.txt‘ mode=‘r‘ encoding=‘UTF-8‘>
文件对象的访问模式
文件模式 | 操作 |
---|---|
r、rt | 以只读方式打开、文件指针-0、不会创建文件 |
w、wt | 以只写方式打开、文件指针-0、创建文件、清空打开的文件 |
a、at | 以追加方式打开、文件指针-end、创建文件、不清空文件 |
x、xt | 创建文件、文件只写、文件指针-0、文件存在-抛出FileExistsError异常 |
r+ | 以读写方式打开、文件指针-0、不会创建文件 |
w+ | 以读写方式打开、文件指针-0、创建文件、清空打开的文件 |
a+ | 以读写方式打开、文件指针-end、创建文件、不清空文件 |
x+ | 创建文件、文件可读写、文件指针-0、文件存在-抛出FileExistsError异常 |
rb | 以二进制只读方式打开(参照r) |
wb | 以二进制只写方式打开(参照w) |
ab | 以二进制追加方式打开(参照a) |
xb | 以二进制只写方式打开(参照x) |
rb+ | 以二进制读写方式打开(参照r+) |
wb+ | 以二进制读写方式打开(参照w+) |
ab+ | 以二进制读写方式打开(参照a+) |
xb+ | 以二进制读写方式打开(参照x+) |
注意:关于r+和a+使用的说明。
In [176]: cat file1.txt
123abc
In [177]: f= open(‘file1.txt‘,‘r+‘)
In [178]: f.write(‘456‘)
Out[178]: 3
In [180]: f.close()
In [181]: cat file1.txt
456abc
In [182]: f= open(‘file1.txt‘,‘a+‘)
In [183]: f.tell()
Out[183]: 6
In [184]: f.seek(0,0)
Out[184]: 0
In [185]: f.write(‘def‘)
Out[185]: 3
In [186]: f.close()
In [187]: cat file1.txt
456abcdef
在Linux系统中常常看到buffer和cache的使用,在Python中其实也是有它们的应用的。其中buffer就是写文件的时候,先写缓冲区,当缓冲区满的时候, 操作系统会把缓冲区flush到硬盘。通常缓冲区越大, 写入性能越好。但是当操作系统掉电、或者进程意外退出,缓冲区的数据可能丢失。注意:缓冲区的数据,对其他进程是不可见的。
由于在Python3中文件写入有文本和二进制模式,所以在buffer上两者的设置使用还是有区别的。
以text模式打开的时候并且buffering=1则其使用的line buffering模式, 遇到换行符就会刷新到硬盘:
In [192]: f=open(‘file.txt‘,‘wt‘,buffering=1)
In [193]: cat file.txt
In [194]: f.write(‘123‘)
Out[194]: 3
In [195]: cat file.txt
In [196]: f.write(‘abc\n‘)
Out[196]: 4
In [197]: cat file.txt
123abc
在以text模式打开文件时,buffering不能设置为0,不然会抛出ValueError: can‘t have unbuffered text I/O的异常。若设置成除了0和1的数字则不是使用的line buffering模式,而是使用当写入缓存区的字符大于等于8193个才会被写入到文件中。
在二进制模式中buffering是可以设置成为0的,所设置成为0则写入的二进制数据会立即刷新到磁盘文件中。
In [73]: f=open(‘file.txt‘,‘wb‘,buffering=0)
In [74]: f.write(b‘A‘)
Out[74]: 1
In [75]: cat file.txt
A
当buffering设置成别的数字的时候则写入的数据直到大于该值则会写入的文件中。
In [77]: f=open(‘file.txt‘,‘wb‘,buffering=10)
In [78]: f.write(b‘A‘*10)
Out[78]: 10
In [79]: cat file.txt
In [80]: f.write(b‘B‘)
Out[80]: 1
In [81]: cat file.txt
AAAAAAAAAA
在实际使用中一般buffering是使用的默认值-1,并不会进行设置除非有特殊需求。而python中默认的buffer可以通过io模块进行查看:
In [1]: import io
In [2]: io.DEFAULT_BUFFER_SIZE
Out[2]: 8192
总结:
open函数中encoding和errors用在打开文本模式,其中encoding用于指定打开文件的编码,默认打开的编码是utf-8,若遇到gbk的文件则可以使用此参数。而我们在文本模式打开文件时若打开的编码格式不正确则会抛出异常,若不想让解释器抛出异常则指定errors参数为ignore,该参数默认是设置成严格模式strict。
In [5]: f=open(‘file.txt‘)
In [6]: f.readable()
Out[6]: True
In [7]: f.read()
Out[7]:‘Defense of the Ancients\nDOTA\n刀塔\n‘
In [13]: f.seek(0,0)
Out[13]: 0
In [14]: f.read(4)
Out[14]: ‘Defe‘
In [15]: f.read()
Out[15]: ‘nse of the Ancients\nDOTA\n刀塔\n‘
In [10]: f.readline()
Out[10]: ‘Defense of the Ancients\n‘
In [11]: f.readline().strip()
Out[11]: ‘DOTA‘
In [12]: f.readline().rstrip(‘\n‘)
Out[12]: ‘刀塔‘
In [14]: f.readlines()
Out[14]: [‘Defense of the Ancients\n‘, ‘DOTA\n‘, ‘刀塔\n‘]
In [10]: f=open(‘test.txt‘,‘w+‘)
In [11]: f.write(‘Defense of the Ancients‘)
Out[11]: 23
In [13]: f.tell()
Out[13]: 23
In [14]: f.seek(0)
Out[14]: 0
In [15]: f.read()
Out[15]: ‘Defense of the Ancients‘
In [16]: f.seek(0)
Out[16]: 0
In [17]: f.write(‘DOTA‘)
Out[17]: 4
In [18]: f.seek(0)
Out[18]: 0
In [19]: f.read()
Out[19]: ‘DOTAnse of the Ancients‘
In [20]: f.close()
In [21]: f=open(‘test.txt‘,‘a+‘)
In [22]: f.write(‘Defense of the Ancients‘)
Out[22]: 23
In [23]: f.seek(0)
Out[23]: 0
In [24]: f.write(‘DOTA‘)
Out[24]: 4
In [25]: f.seek(0)
Out[25]: 0
In [26]: f.read()
Out[26]: ‘DOTAnse of the AncientsDefense of the AncientsDOTA‘
In [28]: f=open(‘test.txt‘,‘w+‘)
In [29]: f.writelines([‘Defense of the Aencients‘,‘DOTA‘])
In [33]: f.close()
In [34]: cat test.txt
Defense of the AencientsDOTA
In [35]: f=open(‘test.txt‘,‘w+‘)
In [37]: f.writelines([‘Defense of the Aencients\n‘,‘DOTA\n‘])
In [39]: f.close()
In [40]: cat test.txt
Defense of the Aencients
DOTA
In [48]: f=open(‘test.txt‘,‘r+‘)
In [50]: f.tell()
Out[50]: 0
In [51]: f.read()
Out[51]: ‘Defense of the Aencients\nDOTA\n‘
In [52]: f.seek(0)
Out[52]: 0
In [53]: f.truncate()
Out[53]: 0
In [55]: f.close()
In [56]: cat test.txt
In [93]: f=open(‘test.txt‘,‘a+‘)
In [107]: f.write(‘DOTA‘)
Out[107]: 4
In [108]: f.tell()
Out[108]: 4
In [109]: f.truncate(2)
Out[109]: 2
In [110]: f.close()
In [111]: cat test.txt
DO
我们在打开文件的时候一定要记住:打开的文件在使用完成后,一定要关闭!这是因CentOS 系统默认打开的文件句柄数是1024,如果出现打开的文件超过系统的上限则会报:[Errno 24] Too many open files: ‘test.txt‘的异常。有些时候我们无法及时close文件则可以使用下面的方法自动的关闭文件。
In [1]: with open(‘test.txt‘) as f:
...: f.read()
...:
In [2]: f.closed
Out[2]: True
flush 强制刷新缓冲区
In [3]: f=open(‘test.txt‘,‘w+‘)
In [4]: f.write(‘Defense of the Ancients‘)
Out[4]: 23
In [5]: cat test.txt
In [6]: f.flush()
In [7]: cat test.txt
Defense of the Ancients
file.seek(off,whence=0)
查看打开的文件名
表示文件是否已经关闭,关闭为True未关闭则为False。
文件使用的编码。
error的模式
In [74]: from io import StringIO,BytesIO
In [75]: fs=StringIO(‘Defense of the Aencients‘)
In [76]: fb=BytesIO(b‘Defense of the Aencients‘)
实际使用:
In [77]: import json
In [84]: fp = StringIO(‘{"a": 1}‘)
In [85]: json.load(fp)
Out[85]: {‘a‘: 1}
In [8]: os.makedirs(‘/tmp/test/test‘)
In [9]: ls -ld /tmp/test/
drwxr-xr-x 3 root root 4096 10月 1 22:18 /tmp/test//
In [11]: os.makedirs(‘/tmp/test/test‘,exist_ok=True)
In [16]: os.makedirs(‘/tmp/test1/test‘,mode=0o700)
In [18]: ls -ld /tmp/test1
drwx------ 3 root root 4096 10月 1 22:21 /tmp/test1/
In [19]: ls -ld /tmp/test1/test/
drwx------ 2 root root 4096 10月 1 22:21 /tmp/test1/test//
In [25]: shutil.rmtree(‘/usr/local/src/test/‘,onerror=lambda fn,path,exc_info:print(‘{} => {}‘.format(path,exc_info[1])))
/usr/local/src/test/ => [Errno 2] No such file or directory: ‘/usr/local/src/test/‘
In [27]: shutil.move(‘/tmp/test‘,‘/tmp/abc‘)
Out[27]: ‘/tmp/abc‘
shutil.copytree(‘/tmp/a‘, ‘/tmp/b‘) == # cp -rp
shutil.copytree(‘/tmp/a‘, ‘/tmp/d‘, symlinks=True) == # cp -rpP
In [38]: for dirname,dirs,files in os.walk(‘/tmp/test1/‘,onerror=lambda e: print(e)):
print(dirname)
print(dirs)
print(files)
print(‘-------------‘)
....:
/tmp/test1/
[‘test‘]
[‘abc.txt‘]
-------------
/tmp/test1/test
[]
[‘def.txt‘]
-------------
[root@hpf-linux ~]# tree -F /tmp/test1/
/tmp/test1/
├── abc.txt
└── test/
└── def.txt
1 directory, 2 files
获取脚本的绝对路径:os.path.abspath(os.path.dirname(sys.argv[0]))
标签:ota 语法 lin 重命名 多个 无法 sans 微软 bytes
原文地址:http://www.cnblogs.com/cuchadanfan/p/6718423.html