文件
打开文件
要读取文件,就得先打开一个文件,可以使用Python内置的open() 函数来打开一个文件,open(<文件名>,<打开模式>)
f = open('test.txt',r)
上面是一个最简单的打开文件的例子,其中在传入文件名时需要将文件所在的绝对路径写上,如果不写则默认会在当前运行Python环境的目录下去寻找该文件,如果文件不在此处,那程序将会报错。
上面说到如果文件不存在,程序将报错,这个错误正是open() 函数抛出的一个IOError 异常,该异常会给出错误码和详细的信息告诉你该文件不存在。
>>> f = open(r"C:/Users/python/text.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'C:/Users/python/text.txt'
由于读写文件经常会出现IOError ,但为了保证无论是否出错都能正常关闭文件,我们可以使用try...except...finally 来解决此问题:
try:
f = open('/path/to/file', 'r')
print(f.read())
except IOError as e:
print("IOError:",e)
finally:
if f:
f.close()
以上程序,如果文件读写出现IOError ,会被except 捕获,并打印相关信息,同时,由于finally 语句块内语句一定会执行,因此只要符合条件,文件就会被关闭。
文件打开模式
文件的打开模式 | 描述 |
---|
‘r’ | 只读模式,默认值,如果文件不存在,返回FileNotFoundError | ‘w’ | 覆盖写模式,文件不存在则创建,存在则完全覆盖 | ‘x’ | 创建写模式,文件不存在则创建,存在则返回FileExistsError | ‘a’ | 追加写模式,文件不存在则创建,存在则在文件最后追加内容 | ‘b’ | 二进制文件模式 | ‘t’ | 文本文件模式,默认值 | ‘+’ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
文件内容读取
如果文件打开成功,接下来可以读文件了
>>> f.read()
"Python is good!"
操作方法 | 描述 |
---|
f.read(size = -1) | 读入全部内容,如果给出参数,读入前size长度 >>> s = f.read(2) | f.readline(size = -1) | 读入一行内容,如果给参数,读入该行前size长度 >>>s = f.readline() | f.readlines(hint=-1) | 读入文件所有行,以每行为元素形成列表,如果给出参数,读入前hint行 |
文件的全文本操作
fname = input("请输入要打开的文件名称:")
fo = open(fname,'r')
txt = fo.read()
fo.close()
fname = input("请输入要开打的文件名称:")
fo = open(fname,'r')
txt = fo.read(2)
while txt != "":
txt = fo.read(2)
fo.close()
文件的逐行操作
fname = input("请输入要打开的文件名称:")
fo = open(fname,'r')
for line in fo.readlines():
print(line)
fo.close()
fname = input("请输入要打开的文件名称:")
fo = open(fname,'r')
for line in fo:
print(line)
fo.close()
二进制文件读取
>>> f = open(r'test.png','rb')
>>> f.read()
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\
字符编码文件读取
有些时候未必所有文本文件都是UTF-8编码的,这种情况需要给open() 函数传入encoding 参数,例如读取GBK编码的文件:
>>> f = open(r'test_gbk.txt', 'r', encoding='gbk')
>>> f.read()
'你好'
特殊的,有些文本文件中可能夹杂了一些非法的编码字符,这样会使得程序遇到UnicodeDecodeError ,此时open() 函数还可以接收一个error 参数,表示如果遇到编码错误后如何处理。而最简单的方式就是忽略该错误:
>>> f = open(r'test_gbk.txt', 'r', encoding='gbk',error='ignore')
文件的写入
操作方法 | 描述 |
---|
f.writes(s) | 向文件写入一个字符串或字节流 >>>f.writes(“中国是一个伟大的国家”) | f.writelines(lines) | 将一个元素全为字符串的列表写入文件(将各个元素直接拼接然后写入文件) >>>ls = [“中国”,“法国”,“美国”] >>>f.writelines(ls) 中国法国美国 | f.seek(offset) | 改变当前文件操作指针的位置,offset含义如下:0-文件开头;1-当前位置;2-文件结尾 >>>f.seek(0) #回到文件开头 |
fo = open(r"output.txt,''w+")
ls = ["中国","法国","美国"]
fo.writelines(ls)
for line in fo:
print(line)
fo.close()
fo = open(r"output.txt,''w+")
ls = ["中国","法国","美国"]
fo.writelines(ls)
fo.seek(0)
for line in fo:
print(line)
fo.close()
这里需要注意的是,不论是读取文件还是写入文件我们都在程序的最后使用了close() 函数,该函数是用来关闭文件的,由于操作文件始终还是通过操作系统提供的接口来对文件对象进行读写,所以在文件使用完毕后需要关闭文件,以免占用操作系统资源。 甚至如果在写入文件时,没有关闭文件,那么文件是不会有任何修改的。
使用with
在上面讲到,读写文件后需要使用close() 函数关闭文件释放资源,但很多时候,人们往往会忘记这最后一步的操作;而with 写法的出现,则使得这一步骤的省略,且实现对文件的读写更加简便。
with open(r'test.txt','r') as f:
print(f.read())
读取大文件
通过前文,我们知道读取文件时可以用read() 或者readlines() 来读取,但这些都是一次性地读入,在文件不是很大的时候,这样做确实能够保证速度,但如果遇到大文件,这种方法就不可取了。Python中有一个fileinput 的模块,可以用它来操作大文件。
from fileinput
>>> for line in fileinput.input(r"hamlet.txt"):
... print(line,end="")
...
Tips
可以观察到在上文的文件路径输入时,路径前都会有个r ,这个的作用是为了使程序不将路径字符串进行转义。这样当路径中出现特殊字符时,就不会被转义,而是以原始字符串常量去处理该路径字符串。这种做法常见于正则表达式于系统路径这两方面。
|