1 什么是文件

文件是用于数据存储的单位

文件通常用来长期保存数据

读写文件是最常见的I/O操作。Python内置了读写文件的函数,用法和C是兼容的。

读写文件的功能都是由操作系统提供的,一般而言,操作系统不允许普通的程序直接操作磁盘,所以读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),再通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个对象(写文件)。

2 文件的打开和关闭的基本规则

文件需要在使用时先打开才能读写

在不需要读写文件后,应及时关闭文件以释放系统资源

任何操作系统对打开的文件数有最大数限制

2.1 文件的打开 open()

f = open('/Users/michael/test.txt', 'r')

/Users/michael/test.txt ——文件路径及文件名

r ——标识符

返回文件流对象,打开失败则会IOError报错!并且给出错误码和详细的信息告诉你文件不存在:

例如在 汉字.txt 文件所在的 文件夹test 位置打开 终端

>>> f = open('汉字.txt',"r")
>>> f
<_io.TextIOWrapper name='汉字.txt' mode='r' encoding='UTF-8'>

打开test_son.txt文件方式

>>> f2 = open("./test/test.txt","r")
>>> f2
<_io.TextIOWrapper name='./test/test.txt' mode='r' encoding='UTF-8'>

注意绝对目录 /Users/michael/test.txt 和相对目录 ./test/test.txt 打开方式区别。

当打开失败时,会提示报错FileNotFoundError

>>> f2 = open("/test/test.txt","r")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/test/test.txt'

打开文件出现错误时,可以用try...except进行异常处理

# 打开文件tset.txt,返回文件流对象并用f绑定
try:
    f = open("test.txt")

    print("文件打开成功")
    # 此处应进行读写操作
    # .....

    #关闭文件
    f.close()

except IOError:
    print("打开文件失败!!")

print("程序结束")

2.2 读文件

2.2.1 read()方法

read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有内容至内存中。

语法: fileObject.read([size]) fileObject 表示文件流对象,size 表示从文件中最多读取的字节数,可选的,若无参数size,则读取至文件结束为止(它范围为字符串对象)。返回从字符串中读取的字节。

>>> f = open("汉字.txt","r")
>>> f.read()
'开始学习Python课程了\n'

备注:汉字.txt文件中语句为:开始学习Python课程了。

2.2.2 readline()方法

该方法时每次读取文件中的一行内容,返回一个字符串对象;

优点是读取时占用内存小,比较适合较大的文件,

文件readline.txt中内容

>>> f = open('readline.txt','r')
>>> f.readline()
'今天是1月26日,\n'
>>> f.readline()
'晴,外面可以看到阳光\n'
>>> f.readline()
'我在认真地学习python\n'
>>> f.readline()
'\n'
>>> f.readline()
''
>>> f.readline()

注意到在输出时自动在末尾加上换行符,readline()方法读到换行符\n时,就会挂起,当再调用时,指针就会向下移动,那如果人为地加上换行符,会是什么样的效果。

文件readline.txt中内容

>>> f2 = open('readline.txt','r')
>>> f2.readline()
'今天是1月26日,\n'
>>> f2.readline()
'晴,外面\\n可以看到阳光\n'
>>> f2 = open('readline.txt','r')
>>> f2.readline()
'今天是1月26日,\n'
>>> f2.readline()
'晴,外面\\n可以看到阳光\n'
>>> f2.readline()
'晴,外面\\\\n可以看到阳光\n'
>>> f2.readline()
"晴,外面'\\\\n'可以看到阳光\n"
>>> f2.readline()
'我在认真地学习python\n'

2.2.3 readlines() 方法

readlines()方法是读取整个文件,并返回一个列表对象,每行作为一个列表元素;故读取大文件时会占有较大的内存

readlines.txt文件内容

>>> f = open('readlines.txt','r')
>>> f.readlines()
['我是第一行\n', '我是第二行\n', '我是第三行\n']

2.2.4 read() readline() readlines() 使用对比

如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

>>> f = open('readlines.txt','r')
>>> for line in f:
...     line.strip() # 把末尾的'\n'删掉
...
'我是第一行'
'我是第二行'
'我是第三行'

>>> f1 = open('readlines.txt','r')
>>> for line in f1.readlines():
...     line.strip() # 把末尾的'\n'删掉
...
'我是第一行'
'我是第二行'
'我是第三行'

2.3 关闭文件close()

第一,降低系统资源消耗;第二,系统再同一时间内打开的文件数量是有限的;故操作完文件后调用close()方法将文件关闭,

语法: f.close() f 为文件流对象

但是文件读写时都由可能产生IOError,一旦出现错误,位于后面的f.close()就不会被调用,也即打开的文件不能被关闭,这个会造成系统资源浪费,为了不管文件是否出错均能正确地关闭该文件,我们可以使用 try...finally 来实现对文件的关闭

try:
    f = open('test.txt', 'r')
    f.read()
finally:
    if f:
        f.close()

2.4 with方法

with方法从 Python 2.5 开始引入的一种与异常处理相关的功能,非常适用与资源访问处理场合;

无论操作对象在使用过程中是否发生异常,在最后阶段,with方法均能将其“清理”并释放资源。

有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。

例如文件使用后的关闭,线程中锁的自动获取和释放等

使用with方法可以替代 try...finally 对文件处理功能

将“2.3 关闭文件close()”中的代码用with语句优化

with open("test.txt",'r') as f:
    f.read()

冗余的代码被with语句优化后显得更加优雅。

2.4 文件的常用方法

方法名 说明
F代表文件流对象  
F.close() 关闭文件
F.readline() 读取一行数据,如果到达文件尾则返回空字符串
F.readlines(max_char=-1) 返回每行字符串列表, max_char为最大字符数
F.read(size=-1) 从一个文件流中最多读取size个字符(或字节(仅二进制))
F.writelines(lines) 字符串列表的内容写到文件中
F.write(text) 写一个字符串(或字节)到文件流中,返回写入字符数(或字节数)
F.tell() 返回当前文件流的绝对位置
F.seek(offset, whence=0) 改变数据流的位置,返回新的绝对位置
F.readable() 判断文件是否可读,可读返回True,否则返回Flase
F.writeable() 判断文件是否可写。可写返回True,否则返回False
F.flush() 把写入文件对象的缓存内容写入到磁盘

2.5 mode模式字符的含义

字符 含义
'r' 以只读方式打开(默认)
'w' 以只写方式打开,删除原有文件内容(如果文件不存在,则尝试创建该文件并以只写方式打开)
'x' 创建一个新文件,并以写模式打开这个文件,如果文件存在则会产生FileExistError错误
'a' 以只写方式打开一个文件,如果有原文件,则追加到文件末尾
't' 文本文件模式打开(默认)
'b' 用二进制模式打开
'+' 为更新内容打开一个磁盘文件(可读可写)
 

备注:当模式为"a"时,不管是否通过seek定位,均直接在文件尾追加文件

缺省模式是 'rt'

可以组合使用:

  'w+b' 可以实现二进制随机读写,当打开文件时,文件内容将被清空

  'r+' 以文本模式读和更新模式打开文件,打开文件时不会清空文件内容

示例:

f = open("output.txt", 'w')

f.write("开始向文件中写入数据...\r\n")
count = f.write("数据的第二行\r\n")
print("您已写入", count, "个字符")

L = ["数据的第三行\r\n", "数据的第四行\r\n", "数据的第五行"]

f.writelines(L)

f.close()

此时文件 output.txt 文件中出现:

开始向文件中写入数据...
数据的第二行
数据的第三行
数据的第四行
数据的第五行

以该文件为基础,再次进行文件操作

f = open("output.txt", 'r+')

s = f.read(1)
print("第一个字符是:", s)
f.write("坏")
f.write("\r\n坏")

f.close()

运行

开始向文件中写入数据...
数据的第二行
数据的第三行
数据的第四行
数据的第五行坏
坏

附不同模式打开的完全列表:

模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

下图很好的总结了这几种模式:

模式 r r+ w w+ a a+
+ +   +   +
  + + + + +
创建     + + + +
覆盖     + +    
指针在开始 + + + +    
指针在结尾         + +

参考文件:

廖雪峰 的 文件读写

python模块

python 文件操作总结

浅谈 Python 的 with 语句

示例微代码


input.txt 文件的内容

今天是平安日
明天是圣诞节
我们更期待春节

python读取代码

# 打开文件,返回文件流对象 用f绑定
try:
    f = open("input.txt")

    print("文件打开成功")
    s = f.read(3)  # 读写两个字符
    print(s)  # '今天'

    f.close()
except IOError:
    print("打开文件失败!!")

print("程序结束")

运行

文件打开成功
今天是
程序结束

参考文档:python文件输入和输出

Python学习笔记015——文件file的常规操作之一(文本文件)的更多相关文章

  1. Python学习笔记015——文件file的常规操作(二进制文件)

    有时候诸如图片.音乐等信息不是以文本的形式存储的,而是二进制文件格式存储的. 有时候很多信息不是以文本文件的形式存储的 很多时候,都需要用到二进制读取文件.毕竟很多信息不是以文本的形式存储.例如:图片 ...

  2. Python学习笔记015——文件file的常规操作之四(输入重定向)

    windows命令提示符(cmd.exe)和Linux Shell(bash等)均可通过">"或”>>“将输出重定向.其中, ">"表示 ...

  3. Python学习笔记015——文件file的常规操作之三(标准输入输出文件)

    1 标准输入输出文件 在Python中,模块sys中含有标准的输入输出文件 sys.stdin     标准输入方法(一般是键盘) sys.stdout   标准输出方法(到显示器的缓冲输出) sys ...

  4. Python学习笔记015——文件file的常规操作seek()及tell()

    1 seek() 1.1 概述 file.seek()用于将文件游标移动到文件的任意位置,便于对文件的当前位置(增.删.改.查)操作 1.2 语法 fileObject.seek(offset[, w ...

  5. [Python学习笔记]组织文件

    shutil 模块 shutil 模块可以让我们很方便的在Python程序中复制.移动.改名和删除文件. 复制文件和文件夹 使用shutil.copy()来复制文件,该函数含两个参数,均为字符串格式的 ...

  6. Python学习笔记之文件处理

    1.打开和关闭 要打开文件可以使用函数 open(),它位于自动导入模块 io 中.函数将文件名作为唯一不可缺少的函数,并返回一个文件对象.它还有一个名叫 mode 的参数,用于指定文件模式,其可取值 ...

  7. python学习笔记(11):文件的访问与函数式编程

    一.文本文件读写的三种方法 1.直接读入 file1 = open('E:/hello/hello.txt') file2 = open('output.txt','w') #w是可写的文件 whil ...

  8. python学习笔记(7)文件的访问与函数式编程

    一.文件读写的3中方法 1.直接读入 fiel1=open('test.txt') file2=open('output.txt') while True: line=file1.readLine() ...

  9. Python学习笔记六--文件和输入输出

    6.1文件对象 所有Python对文件的操作都是基于对文件对象的操作.那么就从文件对象的创建说起.open()[file()]提供初始化输入输出的接口.open()成功打开文件时会返回一个文件对象. ...

随机推荐

  1. water-and-jug-problem

    以下这个解法也是参考了一些讨论: https://leetcode.com/discuss/110235/c-solution-using-euclidean-algorithm 还有这个解释原理的, ...

  2. 附6 hystrix metrics and monitor

    一.基本方式 hystrix为每一个commandKey提供了计数器 二.实现流程 https://raw.githubusercontent.com/wiki/Netflix/Hystrix/ima ...

  3. AngularJs HTTP响应拦截器实现登陆、权限校验

    $httpAngularJS 的 $http 服务允许我们通过发送 HTTP 请求方式与后台进行通信.在某些情况下,我们希望可以俘获所有的请求,并且在将其发送到服务端之前进行操作.还有一些情况是,我们 ...

  4. Nginx配置文件(nginx.conf)配置具体解释

    欢迎扫码增加Java高知群交流 Nginx的配置文件nginx.conf配置具体解释例如以下:   user nginx nginx ; Nginx用户及组:用户 组. window下不指定   wo ...

  5. matlab使用常犯的错误

    总是在最后关掉的时候忘了保存工作空间 save... 我用的版本R2013a 每次要setpath...!!!!!!!!!!

  6. ArcGIS高程Z值的去除方法

    在ArcGIS中,我们常用的几何类型有点.线.面.体(体,在涉及三维的情况下使用),但在这之外,可能会遇到带ZM的类型,如图所示,面ZM,它与面类似,但比面多两个字段. 在编辑中查看草图属性可看到Z值 ...

  7. Excel只能输入不许修改

        昨天出差,用户有个需求:需要他人录入数据,为了防止已经录入的数据被修改(录入数据由多方完成),必须限定只能输入,不能修改(修改时需要密码),最开始的方案是各设置一个密码,但如果他们相互之间联合 ...

  8. JDK5.0特性,使用ProcessBuilder执行本地命令

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...

  9. hdu 4865 Peter&#39;s Hobby(概率dp)

    http://acm.hdu.edu.cn/showproblem.php? pid=4865 大致题意:有三种天气和四种叶子状态.给出两个表,各自是每种天气下叶子呈现状态的概率和今天天气对明天天气的 ...

  10. Android自动填写获取到的验证码

    Android需要添加的相关权限 <uses-permission android:name="android.permission.RECEIVE_SMS">< ...