一、open()
file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])
file:表示要创建的文件对象。
file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。
如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;
否则,此参数需要指定打开文件所在的完整路径。
mode:可选参数,用于指定文件的打开模式。如果不写,则默认以只读(r)模式打开文件,文件不存在会报错
buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区(本节后续会详细介绍)
buffing = 0(或者 False),则不使用缓冲区
buffing 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(单位是字节);
buffing 参数值为负数,使用默认的缓冲区大小
encoding:手动设定打开文件时所使用的编码格式,不同平台的 encoding 的默认参数值也不同
以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)
可以在使用 open() 函数时,手动指定打开文件的编码格式,例如:
file = open("a.txt",encoding="utf-8")
注意,手动修改encoding 参数的值,仅限于文件以文本(r等)的形式打开,
也就是说,以二进制格式(rb等)打开时,不能对 encoding 参数的值做任何修改,
否则程序会抛出 ValueError 异常,如下所示:
ValueError: binary mode doesn't take an encoding argument'
同时以为rb等打开的文件也不能访问encoding属性 否则报错
AttributeError: '_io.BufferedReader' object has no attribute 'encoding'
>>> f=open('H:\\CSprogramsP\\LeetCode\\回文链表.cpp','r')
>>> print(f.encoding)
cp936
>>> f=open(r'H:\CSprogramsP\LeetCode\回文链表.cpp')
>>> print(f.encoding)
cp936
>>> f=open('H:\\CSprogramsP\\LeetCode\\回文链表.cpp','rb',encoding='uft-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: binary mode doesn''t take an encoding argument’
>>> f=open('H:\\CSprogramsP\\LeetCode\\回文链表.cpp','rb')
>>> print(f.encoding)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: '_io.BufferedReader' object has no attribute 'encoding'
注意encoding是说调用open打开文件时采用的编码方式 而不是说这个文件原本的编码方式
通常情况下、建议大家在使用 open() 函数时打开缓冲区,即不需要修改 buffing 参数的值。
内存的 I/O 速度仍远远高于外设(例如键盘、鼠标、硬盘等)的 I/O 速度,如果不使用缓冲区,
则程序在执行 I/O 操作时,内存和外设就必须进行同步读写操作,
也就是说,内存必须等待外设输入(输出)一个字节之后,才能再次输出(输入)一个字节。
这意味着,内存中的程序大部分时间都处于等待状态。
而如果使用缓冲区,则程序在执行输出操作时,会先将所有数据都输出到缓冲区中,
然后继续执行其它操作,缓冲区中的数据会有外设自行读取处理;
同样,当程序执行输入操作时,会先等外设将数据读入缓冲区中,无需同外设做同步读写操作。
Windows下关于python文件打开时SyntaxError OSError文件路径异常
SyntaxError: (unicode error) 'unicodeescape' codec cannot decode bytes
in position 2-3: truncated \UXXXXXXXX escape
OSError: [Errno 22] Invalid argument: 'C:\\Users\\cy\\Desktop\x07.txt'
文件路径
要么统一使用双反斜杠,(可+r也可不+r,推荐不+r)
>>> f=open(r'C:\\Users\\cy\\Desktop\\a.txt','r')
>>>> f=open('C:\\Users\\cy\\Desktop\\a.txt','r') 推荐
要么统一使用单但斜杠+r,(必须+r)
>>> f=open('C:\Users\cy\Desktop\a.txt','r')
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec cannot decode bytes
in position 2-3: truncated \UXXXXXXXX escape
>>> f=open(r'C:\Users\cy\Desktop\a.txt',