读写文件是最常见的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函数的定义:

1 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"", line 1SyntaxError: (unicode error)'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

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

下面有三种解决方式:

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

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

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

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

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

1 >>> f =open('C:\Users\24414\Desktop\test1.txt','r',encoding='utf-8')2 File "", line 1

3 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

4 >>>

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 -- 从文件中读取的字节数。

返回值

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

1 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')2 >>> whileTrue:3 ... line=f.read()4 ... if not line:#到 EOF,返回空字符串,则终止循环

5 ... break

6 ... print(line)7 ...8 往事随风 -齐秦9 词:许常德10 曲:涂惠元11 你的影子无所不在12 人的心事像一颗尘埃13 落在过去 飘向未来14 掉进眼里就流出泪来15 曾经沧海无限感慨16 有时孤独比拥抱实在17 让心春去 让梦秋来18 让你离开19 舍不得忘20 一切都是为爱21 没有遗憾 还有我22 就让往事随风 都随风 都随风 心随你动23 昨天花谢花开 不是梦 不是梦 不是梦24 >>>

2.2.3 readlines()

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

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

语法

readlines() 方法语法如下:

fileObject.readlines( );

参数

无。

返回值

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

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

8 >>>

9 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')10 >>> for line inf.readlines():11 ... print(line)12 ...13 往事随风 -齐秦14

15 词:许常德16

17 曲:涂惠元18

19 你的影子无所不在20

21 人的心事像一颗尘埃22

23 落在过去 飘向未来24

25 掉进眼里就流出泪来26

27 曾经沧海无限感慨28

29 有时孤独比拥抱实在30

31 让心春去 让梦秋来32

33 让你离开34

35 舍不得忘36

37 一切都是为爱38

39 没有遗憾 还有我40

41 就让往事随风 都随风 都随风 心随你动42

43 昨天花谢花开 不是梦 不是梦 不是梦44 >>>

2.3 读取大文件

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

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

这里不再举例

方法二、使用 fileinput 模块:

1 >>> importfileinput2 >>> for line in fileinput.input(r'C:\Users\24414\Desktop\data1.txt'):3 ... print(line)4 ...5 往事随风 -齐秦6

7 词:许常德8

9 曲:涂惠元10

11 你的影子无所不在12

13 人的心事像一颗尘埃14 ......

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

1 >>> f = open(r'C:\Users\24414\Desktop\data1.txt', 'r',encoding='gbk')2 >>>f3 <_io.TextIOWrapper name='C:\\Users\\24414\\Desktop\\data1.txt' mode='r' encoding='gbk'>

4 >>> for line inf:5 ... print(line)6 ...7 往事随风 -齐秦8

9 词:许常德10

11 曲:涂惠元12

13 你的影子无所不在14

15 人的心事像一颗尘埃

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

3、 关闭文件

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

1 f.close()

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

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

注意:

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编码的文件:

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

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

1 >>> 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()方法对应,是将字符串写入到文件中。

1 >>> with open(r'C:\Users\24414\Desktop\data2.txt','w',encoding='gbk') as f:2 ... f.write('1\n2\n3\n')3 ...4 6

5 >>>

writelines()方法和readlines()方法对应,也是针对列表的操作。它接收一个字符串列表作为参数,将他们写入到文件中,换行符不会自动的加入,因此,需要显式的加入换行符。

f1 = open(r'C:\Users\24414\Desktop\data2.txt'

, 'w')

f1.writelines(["1", "2", "3"])#此时test1.txt的内容为:123 f1= open(

r'C:\Users\24414\Desktop\data2.txt', 'w')

f1.writelines(["1\n", "2\n", "3\n"])#此时test1.txt的内容为:#1#2#3

三、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())7f.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();

该方法没有返回值。

1 importsys,time2 for i in range(50):3 sys.stdout.write('#')4 sys.stdout.flush()5 time.sleep(0.5)6 输出>>>

7 ##################################################

3.3 next()

概述

语法

参数

返回值

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

next(iterator[,default])

返回文件下一行。

文档内容:

第一行

第二行

第三行

第四行

第五行

示例:

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

8 1: 第二行9

10 2: 第三行11

12 3: 第四行13

14 4: 第五行15 >>>

3.4 truncate()

概述

语法

返回值

参数

truncate() 方法用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除.

fileObject.truncate([size ])

该方法没有返回值。

size -- 可选,如果存在则文件截断为 size 字节。

有坑:根据上述文档说明不带参truncate()函数会截取文件头到当前游标位置的字节。

但是,当文件以文本的形式打开时,进行读操作造成游标改变时,文件不会被截取.同样的操作,当文件以二进制方式打开时,文件才会被截取.原因还未知

1 f = open("data1", "r+", encoding="utf-8")2 print(f.readline())3 f.truncate()4 f.seek(0)5 print(f.read())6 输出>>>

7 第一行8

9 第一行10 第二行11 第三行12 第四行13 第五行

1 f = open("data1", "r+", encoding="utf-8")2 print(f.readline())3 f.truncate(10)4 f.seek(0)5 print(f.read())6 输出>>>

7 第一行8

9 第一行

3.5 不常用的两个操作

fileno()

返回一个整型的文件描述符,可以用于一些底层IO操作上(如,os模块的read方法)

isatty()

判断文件是否被连接到一个虚拟终端,是则返回True,否则返回False

python文件读取下一个字符_python文件的读写总结相关推荐

  1. python open方法下file模块_python 文件操作

    一.基本概述 基本的文件操作也就常见的几种,创建.打开.读取.写入和关闭文件等.Python中有几个内置模块和方法来处理文件.这些方法在例如os,os.path,shutil和pathlib等等几个模 ...

  2. python 读取文件到字典读取顺序_python顺序的读取文件夹下名称有序的文件方法...

    python顺序的读取文件夹下名称有序的文件方法 如下所示: import os path="/home/test/" #待读取的文件夹 path_list=os.listdir( ...

  3. python中file是什么意思_python文件file

    # 1.编写一个程序,接收用户输入的内容,并且保存为新的文件,如果用户输入:w,表示文件保存退出 with open(r'/Users/liucheng/Desktop/input2.txt', 'w ...

  4. java读取文件夹下的所有txt文件,java读取文件夹下文件及txt内容

    public class PositionController { // 读取txt内容 public static String txt2String(File file) { StringBuil ...

  5. python open找不到文件的原因_浅谈python在提示符下使用open打开文件失败的原因及解决方法...

    题目:在提示符下使用open打开一个文件 刚开始网上看了下打开的方式,结果一直实现不了,报错是没找到这个文件,而且和我输入的文件名不一样. 错误如下: >>>open('d:\456 ...

  6. python 导入csv文件到oracle_python将文件夹下的所有csv文件存入mysql和oracle数据库

    #oracle版 首先新建python脚本(d:/python/orclImport.py) import os #引入os包 if __name__ == '__main__': #遍历文件夹下所有 ...

  7. r读取文件夹下的所有csv文件_[R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。...

    解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独 ...

  8. Python之读取MongoDB导出的BSON文件

    BSON是一种类似于JSON的二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型 ...

  9. python找出某个文件夹下某个后缀的文件

    python找出某个文件夹下某个后缀的文件 import osdef find_files_with_suffix(folder_path, suffix):# 使用os模块获取文件夹中所有文件的路径 ...

最新文章

  1. 技术扫盲:关于低代码编程的可持续性交付设计和分析
  2. MITOS|线粒体在线注释网站
  3. R语言绘图:28个实用程序包
  4. what's the 回撤
  5. 【每周NLP论文推荐】从预训练模型掌握NLP的基本发展脉络
  6. ACM常用之 异或运算的性质。
  7. hdu-1114 Piggy-Bank
  8. 计算机课件比赛总结,课件制作比赛活动总结
  9. Python 基础总结 6 张图 带你学习Python
  10. 解决python在pycharm中可以import本地文件,但命令行运行时报错:no model named xxxx本地文件
  11. 计算机专业最低院校门槛,2021年全国各省高考高校录取最低位次排名查询系统...
  12. java interface作用是什么_Java注解总结:史上最全,有这一篇就够了
  13. JDBC在spring中的使用
  14. linux命令mount是什么,Linux命令——mount、umount
  15. 老板放过我吧!我Java8还没用呢,又让我学习Java14
  16. VAssistX使用
  17. Java selenium 设置代理
  18. macbook 打开多个终端
  19. 关键词挖掘的9种方法
  20. 元转万元单位换算_excel中如何将元换算成万元 excel 万单位 不要万字

热门文章

  1. DYA10面向对象中--断点调试
  2. 2015 中国电商网站排行榜
  3. 小米10pro卡刷教程 卡刷升级官方系统方法
  4. android 六棱形分析图,[转载]菱形整理形态、三角形整理形态图解及分析
  5. windows下更改应用程序属性的详细信息
  6. 运动场球具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. 中地恒达振弦信号采集仪MCU采集模块
  8. ai描边工具怎么打开_AI描边工具命令讲解,教你ai描边功能实用技巧
  9. 文件服务器找不到ad,找不到本地 Exchange 服务器的 AD 对象或者对象无效
  10. 面向接口编程思想(转)