Python 学习基础整理 —— 文件读写(三)
读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
更多关注:
http://www.mknight.cn
os 模块
在介绍读文件之前先说一下os模块。
os.listdir(dirname):列出dirname下的目录和文件
[medivh@medivh Documents]$ ll
总用量 4
-rw-rw-r--. 1 medivh medivh 2611 11月 27 21:38 s.txt
>>> import os
>>> os.listdir('.')
['s.txt']
os.getcwd():获得当前工作目录
>>> os.getcwd()
'/home/medivh/Documents'
os.curdir:返回当前目录('.')
>>> os.curdir
'.'
os.chdir(dirname):改变工作目录到dirname
>>> os.chdir('../')
>>> os.getcwd()
'/home/medivh'
os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false
>>> os.path.isdir('/')
True
>>> os.path.isdir('s.txt')
False
os.path.isfile(name):判断name是不是一个文件,不存在name也返回false
>>> os.path.isfile('/')
False
>>> os.path.isfile('s.txt')
True
os.path.exists(name):判断是否存在文件或目录name
>>> os.path.exists('/home')
True
os.path.getsize(name):获得文件大小,如果name是目录返回0
>>> os.path.getsize('s.txt')
2611
os.path.abspath(name):获得绝对路径
>>> os.path.abspath('s.txt')
'/home/medivh/s.txt'
os.path.normpath(path):规范path字符串形式
标准化路径名,合并多余的分隔符和上层引用,这样
都变成 A/B该字符串操作可能改变包含符号链接的路径的含义。在Windows上,还会将斜线转换成反斜线。若要标准化大小写,请使用 normcase().
os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
>>> os.path.split('/home/medivh/s.txt')
('/home/medivh', 's.txt')
os.path.splitext():分离文件名与扩展名
>>> os.path.splitext('s.txt')
('s', '.txt')
os.path.join(path,name):连接目录与文件名或目录
>>> os.path.join('/home/medivh','s.txt')
'/home/medivh/s.txt'
os.path.basename(path):返回文件名
>>> os.path.basename('/home/medivh/s.txt')
's.txt'
os.path.dirname(path):返回文件路径
>>> os.path.dirname('/home/medivh/s.txt')
'/home/medivh'
其实常用的也就那么几个:
- os.path.join('dirname','filename') 拼接路径
- os.path.abspath(name):获得绝对路径
- os.getcwd():获得当前工作目录
文件模式
模式详细说明
访问模式 | 说明 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
简单对比
模式 | 可做操作 | 若文件不存在 | 是否覆盖 |
---|---|---|---|
r | 只能读 | 报错 | - |
r+ | 可读可写 | 报错 | 是 |
w | 只能写 | 创建 | 是 |
w+ | 可读可写 | 创建 | 是 |
a | 只能写 | 创建 | 否,追加写 |
a+ | 可读可写 | 创建 | 否,追加写 |
读写文件
- 标示符'r'表示读,这样,我们就成功地打开了一个文件。
- 如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示。
- 最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
文件存在时
import os
# 读文件
# 拼接路径
file_name1 = os.path.join(os.getcwd(),'tests.txt')
f = open(file_name1,'r')
print(f.read())
f.close()
#返回结果
asd
s2asd
asd
文件不存在时
如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在。
file_name2 = os.path.join(os.getcwd(),'tests1.txt')
f = open(file_name2,'r')
print(f.read())
f.close()
#返回结果
Traceback (most recent call last):
File "/home/medivh/gitlab/fox/fox/test.py", line 11, in <module>
f = open(file_name2,'r')
FileNotFoundError: [Errno 2] No such file or directory: '/home/medivh/gitlab/fox/fox/tests1.txt'
由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:
file_name2 = os.path.join(os.getcwd(),'tests1.txt')
f = open(file_name2, 'r')
try:
print(f.read())
finally:
if f:
f.close()
with ... open ... as
Python引入了with语句来自动帮我们调用close()方法:
with open(file_name2, 'r') as f:
print(f.read())
代码更佳简洁,并且不必调用f.close()方法。
读文件
read()方法:
1、读取整个文件,将文件内容放到一个字符串变量中
2、如果文件大于可用内存,不可能使用这种处理
readline()方法:
1、readline()每次读取一行,比readlines()慢得多
2、readline()返回的是一个字符串对象,保存当前行的内容
readlines()方法:
1、一次性读取整个文件。
2、自动将文件内容分析成一个行的列表。
调用read()会一次性读取文件的全部内容,如果文件太大,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
for line in f.readlines():
print(line)
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件.
open('xxxx/gbk.txt', 'r', encoding='gbk')
写文件
写文件的话较为简单,使用f.write()就可以了。
with open('xxx/test.txt', 'w') as f:
f.write('Hello a!')
更多关注:
http://www.mknight.cn