美文网首页
Python 学习基础整理 —— 文件读写(三)

Python 学习基础整理 —— 文件读写(三)

作者: Medivh_ | 来源:发表于2017-11-27 22:36 被阅读49次

读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。
更多关注:
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

相关文章

网友评论

      本文标题:Python 学习基础整理 —— 文件读写(三)

      本文链接:https://www.haomeiwen.com/subject/yhljbxtx.html