Python open() 函数用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出错误

完整语法:open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

常用的参数有:

file: 必需,文件路径(相对或者绝对路径)

mode: 可选,文件打开模式,参数表见下图(图片来自https://www.runoob.com/python3/python3-func-open.html)

encoding:编码方式,在python3环境下一般设置为utf-8


只读文件:r模式


前提:在工程文件目录下新建一个yesterday.txt文档,并写入以下文字并保存成utf-8格式(不会设置保存格式的清度娘来帮忙)

我爱你中国1,。
我为你自豪2
我爱你中国3
我为你自豪4
我爱你中国5
我为你自豪6

(注意:第一行后面的逗号是半角的,句号是全角的)

设置文件的句柄f,其中参数r可省略

f = open('yesterday.txt', 'r', encoding='utf-8')  # 只读不可写(默认)

一次性读取文件内容(文件大的时候不建议使用),返回格式str

print(f.read())

ps:在不关闭文件的前提下,文件读取指针在读取的最后一个字符后面。在上面的语句执行后,指针在文件最后

逐行读取,返回格式str,末尾有\n的会多一行空行

f.seek(0)
print(f.readline())
print(f.readline())
print(f.readline())

插播:seek() 方法用于移动文件读取指针到指定位置(单位:字节)。

语法  fileObject.seek(offset[, whence])

参数

  • offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。

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

在utf-8中,部分汉字3字节部分4字节,英文/数字1字节,英文标点符号1字节,中文标点3字节,\n符号2字节

如果seek()取到的位置是一个汉字中间的,会报错

一次性读取,返回格式列表,会读出\n,可通过strip()去掉

print(f.readlines())

一次性读取n字符(而不是字节),返回类型str

print(f.tell())
f.seek(16)
print(f.read(12))


插播:

tell() 方法返回文件的当前位置,即文件指针当前位置(单位:字符)。

语法:fileObject.tell()
从当前位置开始读取12个字符,数字、字母、中英文标点、\n均算一个字符

迭代器逐行读取
f.seek(0)
for line in f:
print(line)


只写文件:w模式或者a模式

w模式:只写不可读;写时不存在则新建,存在则会覆盖原有内容(只要打开这个文件在写入之前,原有内容就被删除了)
a模式:只写不可读;写时不存在则新建,存在则会在末尾追加写入

f =open('my sunshine.txt','w',encoding='utf-8')
f.write('《何以笙箫默》')
f.write('插曲\n')
f.close()

关闭文件后重新打开w模式进行写入,可以发现原来的内容已被删除

f =open('my sunshine.txt','w',encoding='utf-8')
f.write('my sunshine\n\n')
f.close()

关闭文件后重新打开a模式进行写入,可以发现原有内容保留了,并在末尾追加新内容

f =open('my sunshine.txt','a',encoding='utf-8')
f.write('You are my pretty sunshine\n'
'没你的世界好好坏坏只是无味空白\n'
'答应我哪天走失了人海\n'
'一定站在最显眼路牌\n'
'等着我 一定会来\n')
f.write('by 张杰')
f.close()


读写操作r+

打开一个文件(上一段程序运行后的结果)可同时进行读、写


f =open('my sunshine.txt','r+',encoding='utf-8')
print(f.readable(),f.writable())#判断是否可读、可写
print(f.readline())#打印出来会多一行空行
print(f.readline())
print(f.readline())
print(f.readline())
print(f.tell())

运行结果表明,读取了前四行后,光标停留在第90个字节处

注意:运行写入语句时,会忽略读操作的光标位置,而是在全文末尾会追加内容

f.write('\n翻译:你是我的阳光')#在末尾追加,不覆盖不删除,每次运行都追加,并且光标停留在追加内容的后面
这是运行了两遍的结果:


f.seek(13)
f.write('翻译:我的阳光')#使用f.seek()定位光标后,写入的内容会按照位置替换原有内容,并且光标停留在添加的这一句后面
print(f.read())

文档内容:

打印结果:

再次运行单条写入语句

f.write('第二次写入')

会发现第二次写入的位置不在最后而在上一条语句之后,并且也会覆盖原有内容


写读w+


f =open('my sunshine.txt','w+',encoding='utf-8')#若文件存在,打开时已删除原有内容
print(f.readable(),f.writable())#判断是否可读、可写

此时打开这个文件会发现内容全部被清空了,这也是和读写r+ 的唯一区别

运行与r+一样的代码后结果是


追加写读a+


打开文档时不删除原有内容,但是与r+不同的是:光标在原有内容末尾而不是开头

f =open('my sunshine.txt','a+',encoding='utf-8')#打开时不删除原有内容,但是起始光标在末尾
print(f.readable(),f.writable())#判断是否可读、可写 print(f.readline())#因为光标在末尾打印不出来任务东西
print(f.readline())
print(f.readline())
print(f.readline())
print(f.tell()) f.write('\n翻译:你是我的阳光')#在末尾追加,不覆盖不删除,每次运行都追加,并且光标停留在追加内容的后面 f.seek(43)#只对读起作用,写入永远是从后面追加
print(f.readline())
f.write('翻译:我的阳光')#使用f.seek()定位光标后,写入的内容会按照位置替换原有内容,并且光标停留在添加的这一句后面
f.write('第二次写入')
f.close()

输出结果:

文档内容:

a+模式中,seek()只对读语句起作用,写语句均是在末尾追加的,并且追加完的光标会在这一句句尾,同时会影响读

r+、w+、a+ 小结

以上都是文本文件,如果是二进制文件,就都加一个b就行:'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+'

tips

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

源代码:

 #Author:ZM

 '''
#只读操作r f = open('yesterday.txt', 'r', encoding='utf-8') # 只读(默认),txt文件格式需要设置成utf-8 print('一次性读取,返回str'.center(50,'-'))
print(f.read(),type(f.read()))#type时也会运行一遍f.read() print('\n\n\n')
print('逐行读取,返回str'.center(50,'-'))
f.seek(0)
print(f.readline())
print(f.readline())
print(f.readline()) print('\n\n\n')
print('一次性读取,返回list'.center(50,'-'))
print(f.readlines())#返回列表,会读出\n,可通过strip()去掉 print('\n\n\n')
print('一次性读取n字节,返回str'.center(50,'-'))
print(f.tell())
#utf-8中,部分汉字3字节部分4字节,英文/数字1字节,英文标点符号1字节,中文标点3字节,\n符号2字节
#如果seek()取到的位置是一个汉字中间的,会报错
f.seek(16)
print(f.read(12))#从当前位置开始读取12个字符,数字、字母、中英文标点、\n均算一个字符 print('\n\n\n')
print('迭代器逐行读取'.center(50,'-'))
f.seek(0)
for line in f:
print(line) f.close()
''' '''
#只写操作w、a
f =open('my sunshine.txt','w',encoding='utf-8')#只写不可读;写时不存在则新建,存在则会覆盖原有内容(只要打开这个文件在写入之前,原有内容就被删除了)
f.write('《何以笙箫默》')
f.write('插曲\n')
f.close() f =open('my sunshine.txt','w',encoding='utf-8')#只写不可读;写时不存在则新建,存在则会覆盖原有内容(只要打开这个文件在写入之前,原有内容就被删除了)
f.write('my sunshine\n\n') f.close() f =open('my sunshine.txt','a',encoding='utf-8')#只写不可读;写时不存在则新建,存在则会在末尾追加写入
f.write('You are my pretty sunshine\n'
'没你的世界好好坏坏只是无味空白\n'
'答应我哪天走失了人海\n'
'一定站在最显眼路牌\n'
'等着我 一定会来\n')
f.write('by 张杰')
f.close()
''' '''
#读写操作r+
f =open('my sunshine.txt','r+',encoding='utf-8')#打开时不删除原有内容,起始光标在开头 print(f.readable(),f.writable())#判断是否可读、可写
print(f.readline())#打印出来会多一行空行
print(f.readline())
print(f.readline())
print(f.readline())
print(f.tell()) f.write('\n翻译:你是我的阳光')#在末尾追加,不覆盖不删除,每次运行都追加,并且光标停留在追加内容的后面
print(f.read()) f.seek(13)
f.write('翻译:我的阳光')#使用f.seek()定位光标后,写入的内容会按照位置替换原有内容,并且光标停留在添加的这一句后面
f.write('第二次写入')
print(f.read())
f.close() ''' '''
#写读操作w+ f =open('my sunshine.txt','w+',encoding='utf-8')#若文件存在,打开时已删除原有内容
print(f.readable(),f.writable())#判断是否可读、可写 f.write('my sunshine\n\n'
'You are my pretty sunshine\n'
'没你的世界好好坏坏只是无味空白\n'
'答应我哪天走失了人海\n'
'一定站在最显眼路牌\n'
'等着我 一定会来\n'
'by 张杰')
f.seek(0)#将光标从文件末尾移动到开头处
print(f.readline())#打印出来会多一行空行
print(f.readline())
print(f.readline())
print(f.readline())
print(f.tell())
#print(f.readline())
f.write('\n翻译:你是我的阳光')#在末尾追加,不覆盖不删除,并且光标停留在追加内容的后面;每次运行因为均会清空内容,因此只有这一句话不会反复追加
# print(f.read())
f.seek(13)
f.write('翻译:我的阳光')#使用f.seek()定位光标后,写入的内容会按照位置替换原有内容,并且光标停留在添加的这一句后面
f.write('第二次写入')
print(f.read()) f.close()
''' '''
#写读操作a+ f =open('my sunshine.txt','a+',encoding='utf-8')#打开时不删除原有内容,但是起始光标在末尾
print(f.readable(),f.writable())#判断是否可读、可写 print(f.readline())#因为光标在末尾打印不出来任务东西
print(f.readline())
print(f.readline())
print(f.readline())
print(f.tell()) f.write('\n翻译:你是我的阳光')#在末尾追加,不覆盖不删除,每次运行都追加,并且光标停留在追加内容的后面 f.seek(43)#只对读起作用,写入永远是从后面追加
print(f.readline())
f.write('翻译:我的阳光')#使用f.seek()定位光标后,写入的内容会按照位置替换原有内容,并且光标停留在添加的这一句后面
f.write('第二次写入')
f.close() ''' #以上都是文本文件,如果是二进制文件,就都加一个b就行:'rb'  'wb'  'ab'  'rb+'  'wb+'  'ab+' #字符编码
'''
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件: f = open('test.txt', 'r', encoding='gbk') 遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略: f = open('test.txt', 'r', encoding='gbk', errors='ignore')
'''
f = open('gbk文档的读写.txt',encoding='utf-8')
print(f.readline()) '''
你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:
'''
# with open('yesterday.txt', 'rb') as f:
# print(f.read())

python3中文件的读与写的更多相关文章

  1. python中文件的读和写操作

    一.打开文件 data = open("yesterday",encoding="utf-8").read() # python默认的打字符编码是unicode ...

  2. python3 excel文件的读与写

    from openpyxl import load_workbook class RwExcelFile: def read_Excel(self,file_path): ''' 读取excel中所有 ...

  3. java 安卓开发之文件的读与写

    java文件的读与写,代码: String file="user.txt"; private void writeFileData(String str1, String str2 ...

  4. python文件处理-读、写

    Python中文件处理的操作包括读.写.修改,今天我们一起来先学习下读和写操作. 一.文件的读操作 例一: #文件读操作 f = open(file="first_blog.txt" ...

  5. Python3中文件处理

    1.txt,xls,doc等文件的使用 f=open("filename","w")   打开一个用于写入的文件,要写入内容时使用f.write("内 ...

  6. POI完成Excel文件的读和写

    简介 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel.WORD.PowerPo ...

  7. day5_函数_文件读写_用一个函数来满足文件的读或者写_应用默认参数

    import json def op_file_tojson(filename,dic=None): #默认值参数,根据是否传dic字典来判断读还是写 if dic: #如果dic传了值,不是空的,则 ...

  8. python3中文件/IO编程

    python3的文件操作可谓是我见过所有语言中最舒服的,那我们来一起看一下py3中的文件操作. 1:文件的打开方式有以下几种: 注:以上图表参考菜鸟教程 2:定位读写文件  f = open(&quo ...

  9. WPF程序中App.Config文件的读与写

    WPF程序中的App.Config文件是我们应用程序中经常使用的一种配置文件,System.Configuration.dll文件中提供了大量的读写的配置,所以它是一种高效的程序配置方式,那么今天我就 ...

随机推荐

  1. 开源的SSH框架优缺点分析

    开源是3个框架共有的优点 Struts2框架(MVC框架)的优点如下: 1) 实现了MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现: 2) 丰富的标签库,大大提高了开发的效率: 3) Str ...

  2. SpringBoot | 第二十五章:日志管理之自定义Appender

    前言 前面两章节我们介绍了一些日志框架的常见配置及使用实践.一般上,在开发过程中,像log4j2.logback日志框架都提供了很多Appender,基本上可以满足大部分的业务需求了.但在一些特殊需求 ...

  3. 八个cmd 命令

    一,ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP ...

  4. Devexpress之GridControl显示序列号

    先上图: 操作方法: 1.先设置一下gridview中属性:IndicatorWidth,一般为:40.如下图:(一般可以显示5位数字.如要更长显示,自己测试一下.) 2.找到gridview中的:C ...

  5. flask SQLAlchemy--column 列的类型

    最常用的SQLAlchemy列类型 类型名 Python类型 说 明 Integer int 普通整数,一般是 32 位 SmallInteger int 取值范围小的整数,一般是 16 位 BigI ...

  6. Json Web Token 简介

    1.Json Web Token是干什么        简称JWT,在HTTP通信过程中,进行身份认证.       我们知道HTTP通信是无状态的,因此客户端的请求到了服务端处理完之后是无法返回给原 ...

  7. MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析

    MATLAB之数学建模:深圳市生活垃圾处理社会总成本分析 注:MATLAB版本--2016a,作图分析部分见<MATLAB之折线图.柱状图.饼图以及常用绘图技巧> 一.现状模式下的模型 % ...

  8. 【C++函数重载】求3个数中最大的数(分别考虑整数、双精度数、长整数的情况)。

    #include using namespace std; int main( ) { int max(int a,int b,int c); //函数声明 double max(double a,d ...

  9. linux 命令——19 find (转)

    Linux 下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所 以它的选项也很多,其中大部分选项都值得我们 ...

  10. http请求头和相应头的作用

    请求头(Request Headers) Accept:application/json, text/plain, */* Accept-Encoding:gzip, deflate Accept-L ...