读写文件

author author     2022-09-29     222

关键词:

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

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

读文件

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

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

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

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

>>> f=open(‘/Users/michael/notfound.txt‘, ‘r‘)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: ‘/Users/michael/notfound.txt‘

如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:

>>> f.read()‘Hello, world!‘

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

>>> f.close()

由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try ... finally来实现:

try:
    f = open(‘/path/to/file‘, ‘r‘)    print f.read()finally:    if f:
        f.close()

但是每次都这么写实在太繁琐,所以,Python引入了with语句来自动帮我们调用close()方法:

with open(‘/path/to/file‘, ‘r‘) as f:    print f.read()

这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。

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

for line in f.readlines():
    print(line.strip()) # 把末尾的‘
‘删掉

file-like Object

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

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

二进制文件

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

>>> f = open(‘/Users/michael/test.jpg‘, ‘rb‘)>>> f.read()‘xffxd8xffxe1x00x18Exifx00x00...‘ # 十六进制表示的字节

字符编码

要读取非ASCII编码的文本文件,就必须以二进制模式打开,再解码。比如GBK编码的文件:

>>> f = open(‘/Users/michael/gbk.txt‘, ‘rb‘)>>> u = f.read().decode(‘gbk‘)>>> uu‘u6d4bu8bd5‘>>> print u
测试

如果每次都这么手动转换编码嫌麻烦(写程序怕麻烦是好事,不怕麻烦就会写出又长又难懂又没法维护的代码),Python还提供了一个codecs模块帮我们在读文件时自动转换编码,直接读出unicode:

import codecswith codecs.open(‘/Users/michael/gbk.txt‘, ‘r‘, ‘gbk‘) as f:
    f.read() # u‘u6d4bu8bd5‘

写文件

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

>>> f = open(‘/Users/michael/test.txt‘, ‘w‘)>>> f.write(‘Hello, world!‘)>>> f.close()

你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

with open(‘/Users/michael/test.txt‘, ‘w‘) as f:
    f.write(‘Hello, world!‘)

要写入特定编码的文本文件,请效仿codecs的示例,写入unicode,由codecs自动转换成指定编码。

小结

在Python中,文件读写是通过open()函数打开的文件对象完成的。使用with语句操作文件IO是个好习惯。


本文出自 “为了明日” 博客,请务必保留此出处http://andyboge.blog.51cto.com/6809119/1980341

c语言文件的读写(代码片段)

引入OS操作系统打开文件fopen()函数读写模式:r:读取已有文件w:文件不存在,创建文件并写入文件.文件存在,内容清零,再写入文件a:文件不存在,创建文件并写入文件.文件存在,以追加的形式写入文件r+:读写已有文件w+:文件不存... 查看详情

文件读写函数

字符读写函数:   fgetc/fputc字符串读写函数:fputs/fgets格式化读写函数:fscanf/fprintf二进制读写函数:fread/fwrite其他相关函数:检测文件结尾函数feof检测文件读写出错函数ferror清除末尾标志和出错标志函数clearerr文件定... 查看详情

io编程-----读写文件

读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件... 查看详情

c语言文件操作相关函数(代码片段)

...数文件打开(fopen)参数mode可选值案例文件关闭(fclose)文件读写相关函数总览字符读写函数字符读写案例行读写函数行读写案例块读写函数块读写案例格式化读写函数格式化读写案例随机读写函数随机读写案例文件操作综合案例头... 查看详情

c语言文件操作相关函数(代码片段)

...数文件打开(fopen)参数mode可选值案例文件关闭(fclose)文件读写相关函数总览字符读写函数字符读写案例行读写函数行读写案例块读写函数块读写案例格式化读写函数格式化读写案例随机读写函数随机读写案例文件操作综合案例头... 查看详情

标准i/o读写文件

...只读文件,该文件必须存在。        r+打开可读写的文件,该文件必须存在。        rb+读写打开一个二进制文件,只允许读写数据。        rt+读写打开一个文本文件,允许读和写。      ... 查看详情

配置文件读写

配置文件的读写  System.ConfigurationManager类用于对配置文件的读取。其具有的成员如下:一、AppSettings   AppSetting是最简单的配置节,读写非常简单。名称说明AppSettings获取当前应用程序默认配置的AppSettingsSection数据Connection... 查看详情

文件操作读写文本文件

【读写txt文件】r:只读w:只写模式【不可读;不存在则创建;存在则清空内容】w+:w+,写读【可读,可写】,消除文件内容,然后以读写方式打开文件。#coding=utf-8#读文件defread_file():#读取文件read_txt=open(‘txt/read_txt‘,‘r‘)#一... 查看详情

如何读写 XML 文件?

】如何读写XML文件?【英文标题】:HowtoreadandwriteXMLfiles?【发布时间】:2011-11-1411:20:00【问题描述】:我必须读写XML文件。使用Java读写XML文件最简单的方法是什么?【问题讨论】:通过StAX进行内存高效的部分xml解析:***.com/questi... 查看详情

如何读写 XML 文件?

】如何读写XML文件?【英文标题】:HowtoreadandwriteXMLfiles?【发布时间】:2017-01-1215:02:27【问题描述】:我必须读写XML文件。使用Java读写XML文件最简单的方法是什么?【问题讨论】:通过StAX进行内存高效的部分xml解析:***.com/questi... 查看详情

文件流读写

1.命名空间  System.IO2.五句创建及完成读写操作句子  FileStreammyfs=newFileStream(path,FileMode.Open);//创建读写流,path为路径  StreamWritermysw=newStreamWriter(myfs);//创建读写器  //StreamRead 查看详情

#littlefs原理分析#[五]文件读写(代码片段)

...ittlefs中的目录操作,这一篇文章则将介绍littlefs中的文件读写操作。本文会根据文件的存储类型进行介绍,即inline文件和outline文件,其读写过程也有差别。另外还会介绍inline文件到outline文件的转换,以及littlefs底层的读写API。1.... 查看详情

c文件读写

0.文件操作相关函数 1. 文件分为字符方式读写,字节方式(二进制方式)读写  fprintf/fscanf FILE*file;//全局定义voidsave(Bookbooks[]){inti;if((file=fopen(PATH,FW))==NULL){printf("文件保存失败,请检查文件是否存在!");return;}for(i=0;i<cnt;i++){... 查看详情

文件读写

  查看详情

文件读写(笔记)

...;不存在则创建;存在则只追加内容;】"+"表示可以同时读写某个文件r+,可读写文件。【可读;可写;可追加】w+,写读a+,同awith语句:为了避免打开文件后忘记关闭,可以通过管理上下文,即:withopen(filenam 查看详情

linu基础文件io(读写操作)

前言本章讨论普通文件的读写、读写效率、简单介绍文件描述符、IO效率、文件共享和原子操作、dup、文件映射、临时文件。文件描述符在Linux系统中,打开的文件是用一个整数来表示的,表示打开文件的整数,称之为文件描述... 查看详情

python中文件读写(代码片段)

 2019-06-01Python中的文件读写操作文件过程如下1、打开文件   格式:open(path,flag[,encoding][,errors])    path:表示要打开文件的路径,flag:表示打开方式r以只读的方式打开文件,文件的描述符放在文件的开头rb以二进制格式... 查看详情

文件读写

-----------写FileOutputStreamfos=newFileOutputStream(newFile("C:\Users\fenglei.ma\Desktop\新建文件夹\sid.txt")); OutputStreamWriterosw=newOutputStreamWriter(fos,"utf-8"); PrintWriterpw=newPrintWrit 查看详情