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

读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。

python 文件操作记住1个函数3个方法:(python中一切皆为对象)

open():请求打开文件:

  如果文件存在返回文件的操作对象,

  如果文件不存在,会抛出异常

关于open()的mode参数

'r':读

'w':写

'a':追加

'r+' == r+w(可读可写,文件若不存在就报错(IOError))

'w+' == w+r(可读可写,文件若不存在就创建)

'a+' ==a+r(可追加可写,文件若不存在就创建)

对应的,如果是二进制文件,就都加一个b就好啦:

'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'

read方法——读取文件,将文件读取到内存中,可以一次性读取文件所有内容

write方法——将文件内容写入到文件

close方法——关闭文件

准备文档

往事随风 - 齐秦
词:许常德
曲:涂惠元
你的影子无所不在
人的心事像一颗尘埃
落在过去 飘向未来
掉进眼里就流出泪来
曾经沧海无限感慨
有时孤独比拥抱实在
让心春去 让梦秋来
让你离开
舍不得忘
一切都是为爱
没有遗憾 还有我
就让往事随风 都随风 都随风 心随你动
昨天花谢花开 不是梦 不是梦 不是梦

一、读文件

1、打开文件

要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符.

首先,我们看下open函数的定义:

 def open(file: Union[str, bytes, int], mode: str = ..., buffering: int = ..., encoding: Optional[str] = ..., errors: Optional[str] = ..., newline: Optional[str] = ..., closefd: bool = ...) Inferred type: (file: Union[str, bytes, int], mode: str, buffering: int, encoding: Optional[str], errors: Optional[str], newline: Optional[str], closefd: bool) -> IO Open file and return a stream. Raise IOError upon failure. 

在一般情况下,我们打开文件只需要传入文件路径即可,这里我们读取的文件的内容是中文,为了避免乱码,我们在这里指定了编码格式。其他的参数等我们用到的时候,在仔细说明。open函数返回一个表示文件的对象,python会将这个对象存储在我们的变量f中,这样我们就可以方便的操作了。

我先在桌面创建一个名叫test.txt的文本文件:

>>> f =open('C:\Users\24414\Desktop\test.txt','r',encoding='utf-8')//以绝对路径打开文件
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

出现这个错误的原因是:windows中的路径是反斜杠\,然而反斜杠\在python中有着转义字符的意义,所以在py文件中写windows文件路径的时候,要特别注意反斜杠\的使用。

下面有三种解决方式:

 >>> f =open('C:\\Users\\24414\\Desktop\\test.txt','r',encoding='utf-8')
>>>
>>> f =open(r'C:\Users\24414\Desktop\test.txt','r',encoding='utf-8')
>>>
>>> f =open('C:/Users/24414/Desktop/test.txt','r',encoding='utf-8')
>>>

标示符'r'表示读,这样,我们就成功地打开了一个文件。

如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在:

 >>> f =open('C:\Users\24414\Desktop\test1.txt','r',encoding='utf-8')
File "<stdin>", line 1
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
>>>

2、读取文件

2.1 读取整个文件

操作文件的第一步就是得打开要操作的文件,然后进行读取。在python中我们可以使用open函数来打开一个文件,然后使用read方法来读取文件。

示例1,data.txt和我们的文件在同一目录下,所以直接使用名称即可::

如果是其他路径(非程序目录),那么直接使用绝对路径:
我是在window的开发环境,以windows为例,我们在桌面有一个data1.txt文件:我们在将文件打开后,打印一下这个f到底有些什么:

>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> f.read()
'往事随风 - 齐秦\n词:许常德\n曲:涂惠元\n你的影子无所不在\n人的心事像一颗尘埃\n落在过去 飘向未来\n掉进眼里就流出泪来\n 曾经沧海无限感慨\n有时孤独比拥抱实在\n让心春去 让梦秋来\n让你离开\n舍不得忘\n一切都是为爱\n没有遗憾 还有我\n就让往事随风 都随风 都随风 心随你动\n昨天花谢花开 不是梦 不是梦 不是梦'
>>>

print(dir(f))

输出:

['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']
>>>

这些都是和文件操作相关的,在这里不会给大家做仔细说明,只是让大家对这些东西有个印象,等遇到了,我们在说怎么使用。

2.2 逐行读取

上面是读取整个文件内容,接下来我们看下怎么逐行读取文件。
在逐行读取文本的时候,常见的可以使用for循环来读取:

2.2.1 read()

read:如果指定了参数 size,就按照该指定长度从文件中读取内容,否则,就读取全文。被读出来的内容,全部塞到一个字符串里面。这样有好处,就是东西都到内存里面了,随时取用;但如果文件内容太多了,内存会吃不消。注意换行符也为占用一个内存,缺点需要知道光标的位置,以及每一行的大小SIZE。

>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> f.read(10)
'往事随风 - 齐秦\n'
>>> f.read(5)
'词:许常德'
>>>

2.2.2 readline()

概述:readline() 方法用于从文件读取整行,包括 "\n" 字符。从字面意思可以看出,该方法每次读出一行内容。所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。如果指定了一个非负数的参数,则返回指定大小的字节数,包括 "\n" 字符。

语法

fileObject.readline();

参数

  • size -- 从文件中读取的字节数。

返回值

返回从字符串中读取的字节。

 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> while True:
... line=f.read()
... if not line:#到 EOF,返回空字符串,则终止循环
... break
... print(line)
...
往事随风 - 齐秦
词:许常德
曲:涂惠元
你的影子无所不在
人的心事像一颗尘埃
落在过去 飘向未来
掉进眼里就流出泪来
曾经沧海无限感慨
有时孤独比拥抱实在
让心春去 让梦秋来
让你离开
舍不得忘
一切都是为爱
没有遗憾 还有我
就让往事随风 都随风 都随风 心随你动
昨天花谢花开 不是梦 不是梦 不是梦
>>>

 2.2.3 readlines()

概述:readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。当文件太大时,内存可能不够用。 如果碰到结束符 EOF 则返回空字符串。

如果碰到结束符 EOF 则返回空字符串。

语法

readlines() 方法语法如下:

fileObject.readlines( );

参数

  • 无。

返回值

返回列表,包含所有的行。

 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> print(f.readlines())
['往事随风 - 齐秦\n', '词:许常德\n', '曲:涂惠元\n', '你的影子无所不在\n', '人的心事像一颗尘埃\n', '落在过去 飘向未来\n', '掉进眼里就流出泪来\n', '曾经沧海无限感慨\n', '有时孤独比拥抱实在\n', '让心春去 让梦秋来\n', '让你离开\n', '舍不得忘\n', '一切都是为爱\n', '没有遗憾 还有我\n', '就让往事随风 都随风 都随风 心随你动\n', '昨天花谢花开 不是梦 不是梦 不是梦']
>>> for line in f.readlines():
... print(line)
...
>>>
>>>
>>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> for line in f.readlines():
... print(line)
...
往事随风 - 齐秦 词:许常德 曲:涂惠元 你的影子无所不在 人的心事像一颗尘埃 落在过去 飘向未来 掉进眼里就流出泪来 曾经沧海无限感慨 有时孤独比拥抱实在 让心春去 让梦秋来 让你离开 舍不得忘 一切都是为爱 没有遗憾 还有我 就让往事随风 都随风 都随风 心随你动 昨天花谢花开 不是梦 不是梦 不是梦
>>>

 2.3 读取大文件

如果文件太大,就不能用 read() 或者 readlines() 一次性将全部内容读入内存。

方法一、可以使用 while 循环和 readline() 来完成这个任务。

这里不再举例

方法二、使用 fileinput 模块:

 >>> import fileinput
>>> for line in fileinput.input(r'C:\Users\24414\Desktop\data1.txt'):
... print(line)
...
往事随风 - 齐秦 词:许常德 曲:涂惠元 你的影子无所不在 人的心事像一颗尘埃
......

第三种方法,直接读取文件句柄,推荐使用这种方法

 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')
>>> f
<_io.TextIOWrapper name='C:\\Users\\24414\\Desktop\\data1.txt' mode='r' encoding='gbk'>
>>> for line in f:
... print(line)
...
往事随风 - 齐秦 词:许常德 曲:涂惠元 你的影子无所不在 人的心事像一颗尘埃

之所以能够如此,是因为 file 是可迭代的数据类型,直接用 for 来迭代即可

3、 关闭文件

 最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:

 f.close()

 每次都要使用完都要关闭文件,很容易忘记,而且每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

 >>> with open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk') as f:
... for line in f:
... print(line.strip())
...
往事随风 - 齐秦
词:许常德
曲:涂惠元
你的影子无所不在
人的心事像一颗尘埃
落在过去 飘向未来
掉进眼里就流出泪来
曾经沧海无限感慨

 注意:

file-like Object

open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()方法就行。

StringIO就是在内存中创建的file-like Object,常用作临时缓冲。

二进制文件

前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用'rb'模式打开文件即可:

字符编码

要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

 >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'

遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略:

 >>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')

二、写文件

写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件

>>> f = open(r'C:\Users\24414\Desktop\data2.txt', 'w',encoding='gbk')
>>> f.write('Hello world!')
12
>>>f.flush()

注意:如果指定路径没有data2.txt文件,它会先创建一个文件。

当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。如果没有这句代码f.flush(),内容只是被写到了缓冲区,等缓冲区满了,才会将内容写到文件中。有了这句代码就会直接写入到文本中,而不会等待缓冲区满。当然也可以最后,调用f.close()实现相同的功能。没有这一步的后果是数据可能只写了一部分到磁盘,剩下的丢失了。

python文件对象提供了两个“写”方法: write() 和 writelines()。

  • write()方法和read()、readline()方法对应,是将字符串写入到文件中。
 >>> with open(r'C:\Users\24414\Desktop\data2.txt','w',encoding='gbk') as f:
... f.write('1\n2\n3\n')
...
6
>>>

  • writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。
f1 = open(r'C:\Users\24414\Desktop\data2.txt'
, 'w') 
f1.writelines(["", "", ""]) # 此时test1.txt的内容为:123
f1 = open(
r'C:\Users\24414\Desktop\data2.txt', 'w')
f1.writelines(["1\n", "2\n", "3\n"])
# 此时test1.txt的内容为: # # 2 #

三、file类的其他方法

3.1 tell()和seek()  注意:这里的位置指的是字节数,而不是字符个数

  tell() seek()
概述 返回文件的当前位置,即文件指针当前位置。 用于移动文件读取指针到指定位置。
语法 fileObject.tell()
fileObject.seek(offset[, whence])
参数
  • offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。

  • whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。

返回值 返回文件的当前位置。 如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。

 

 1 with open('data', 'r', encoding='utf-8') as f:
2 print(f.readline().rstrip())
3 print(f.tell())
4 print(len('往事随风 - 齐秦\n'.encode('utf-8')))
5 print(f.read(4))
6 print(f.tell())
7 f.seek(0)
8 print(f.readline().rstrip())
9 输出>>>
10 往事随风 - 齐秦
11 23
12 22
13 词:许常
14 35
15 往事随风 - 齐秦

3.2 File flush()

概述

语法

参数

返回值

flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。

一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。

fileObject.flush();

   该方法没有返回值。
 import  sys,time
for i in range(50):
sys.stdout.write('#')
sys.stdout.flush()
time.sleep(0.5)
输出>>>
##################################################

3.3 next()

概述 语法 参数 返回值
Python 3 的内置函数 next() 通过迭代器调用 __next__() 方法返回下一项。 在循环中,next()方法会在每次循环中调用,该方法返回文件的下一行,如果到达结尾(EOF),则触发 StopIteration
next(iterator[,default])
返回文件下一行。

文档内容:

第一行
第二行
第三行
第四行
第五行

示例:

 >>> f=open(r'C:\Users\24414\Desktop\data1.txt','r')
>>> for index in range(5):
... line=next(f)
... print(index,':',line)
...
0 : 第一行 1 : 第二行 2 : 第三行 3 : 第四行 4 : 第五行
>>>

3.4 truncate()

概述

语法

返回值

参数

truncate() 方法用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除.
fileObject.truncate( [ size ])
该方法没有返回值。 size -- 可选,如果存在则文件截断为 size 字节。

有坑:根据上述文档说明不带参truncate()函数会截取文件头到当前游标位置的字节。
但是,当文件以文本的形式打开时,进行读操作造成游标改变时,文件不会被截取.同样的操作,当文件以二进制方式打开时,文件才会被截取.原因还未知

 f = open("data1", "r+", encoding="utf-8")
print(f.readline())
f.truncate()
f.seek(0)
print(f.read())
输出>>>
第一行 第一行
第二行
第三行
第四行
第五行
 f = open("data1", "r+", encoding="utf-8")
print(f.readline())
f.truncate(10)
f.seek(0)
print(f.read())
输出>>>
第一行 第一行

3.5 不常用的两个操作

fileno() 返回一个整型的文件描述符,可以用于一些底层IO操作上(如,os模块的read方法)
isatty() 判断文件是否被连接到一个虚拟终端,是则返回True,否则返回False

python文件的读写总结的更多相关文章

  1. python文件的读写的模式

    <1>打开文件 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件 open(文件名,访问模式) 示例如下: f = open('test.txt', 'w' ...

  2. Python文件的读写操作

    Python文件的使用 要点:Python能够以文本和二进制两种形式处理文件. 1.文件的打开模式,如表1:  注意:使用open()函数打开文件,文件使用结束后耀使用close()方法关闭,释放文件 ...

  3. python文件的读写权限以及相关应用read、write和文件指针

    f=open('ceshi.txt','a',encoding='utf-8')r=open('ceshi.txt','r',encoding='utf-8')上面的2种写法可以用with来写:wit ...

  4. Python文件的读写

    一.写数据 f = open("hello.txt", "w") f.write("hello world python!") f.clos ...

  5. 【8】python文件的读写方法

    (1).读文件的步骤: (1)打开文件 open(path,flag,encoding,[errors]) path:打开路径 flag:打开方式 r(只读) rb(二进制格式) r+(可以读写) w ...

  6. [ Python ] 文件的读写操作

    1. 文件读写操作 读写文件是最常见的 IO 操作, Python 内置了读写文件的函数.在磁盘上读写文件的功能是由操作系统提供的,所以读写文件是请求操作系统打开一个文件对象(通常称为文件描述符),然 ...

  7. python文件的读写追加等操作

    # encoding:utf-8 # 文件读取操作 fp=open("E:\\file.txt","r",encoding="utf-8" ...

  8. 第9.9节 Python文件随机读写定位操作方法seek

    类似于C语言,Python也提供了文件位置定位的操作方法seek. 一. 语法 seek(offset, whence=SEEK_SET) 语法释义: 1)offset :将文件当前操作位置移动偏移量 ...

  9. python: 文件的读写

    #文件的读取.py a=open('test.txt').readline() #只读取文件第一行,保存为字符串格式 b=open('test.txt').read() #读取全部内容,保存为字符串格 ...

随机推荐

  1. PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  2. springboot2.0+websocket集成【群发消息+单对单】(二)

    https://blog.csdn.net/qq_21019419/article/details/82804921 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上 ...

  3. django ORM数据库操作

    5.使用Django的ORM详细步骤: 1. 自己动手创建数据库 create database 数据库名; 2. 在Django项目中设置连接数据库的相关配置(告诉Django连接哪一个数据库) # ...

  4. Python 循环列表删除元素的注意事项

    错误示范: class Solution: def removeElement(self, nums, val: int) -> int: for i, num in enumerate(num ...

  5. sendmail 出现 My unqualified host name的解决办法

    有"My unqualified host name"错误 修改/etc/hosts, 在本机的ip那一行, 在xxxhostname后面加上"  xxxhostname ...

  6. 计蒜客NOIP模拟D1T2

    原题: 蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少.另外,由于各种原因,蒜头君的树的边的边权会发生若干次改变,蒜头君想让你告诉他,每一次改变后,任意两点间最短距离 ...

  7. substr()、substring()、slice()

    substr(start,length) start(必选)开始位置的下标 可为负数-1即为倒数第一个字符以此类推 0为第一个字母下标 length长度(可选)如果省略该参数则默认到最后一位 var ...

  8. Docker常规操作

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11601853.html Docker 常⽤命令 镜像相关 • docker pull <imag ...

  9. 【LeetCode 84】柱状图中最大的矩形

    题目链接 [题解] 维护一个单调递增的栈. 会发现栈内的第i个元素的前面一个(i-1)元素在原始的序列中的数字 都是要高于第i个元素的.(或者没有元素) 那么第i个元素往左最多可以扩展到第i-1个元素 ...

  10. 【Python】用python -m http.server 8888搭建本地局域网

    python -m http.server 8888 由于工作中经常会用到局域网中同事之间互传文件,当文件太大时,可以采用局域网ftp之类的方式进行传输. 这里采用python的一个服务,可以快速的搭 ...