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. C# 调用NPOI 修改Excel 完成实时更新公式结果

    C# 调用NPOI,修改EXCEL中的数据后并保存后,不会对公式进行更新操作.打开Excel表需要更新一下公式才生效 强制更新公式:C# 调用sheet.ForceFormulaRecalculati ...

  2. 安装flask-mysqldb的时候,提示 mysql_config not found 的解决方法

    解决办法: sudo apt-get install libmysqlclient-dev sudo updatedb locate mysql_config 然后进入mysql_config的路径( ...

  3. WPF根据数据项获取条目控件的方法-ItemContainerGenerator

    一.方法: ContainerFromIndex:返回 ItemCollection 中指定索引处的项的容器. ContainerFromItem:返回与制定的项对应的容器(ComboxItem等条目 ...

  4. Counting blessings can actually increase happiness and health by reminding us of the good things in life.

    Counting blessings can actually increase happiness and health by reminding us of the good things in ...

  5. Hibernate笔记3--多表操作-导航查询

    一.一对多操作 1.构造实体类及编写配置文件:     一方:  // 一个Customer对应多个linkman private Set<Linkman> linkmans = new ...

  6. iOS核心动画高级技巧之图层变换和专用图层(二)

    iOS核心动画高级技巧之CALayer(一) iOS核心动画高级技巧之图层变换和专用图层(二)iOS核心动画高级技巧之核心动画(三)iOS核心动画高级技巧之性能(四)iOS核心动画高级技巧之动画总结( ...

  7. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate

    目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...

  8. 一个SAP顾问在美国的这些年

    今天的文章来自我的老乡宋浩,之前作为SAP顾问在美国工作多年.如今即将加入SAP成都研究院S4CRM开发团队.我们都是大邑人. 大邑县隶属于四川省成都市,位于成都平原西部,与邛崃山脉接壤.东与崇州市交 ...

  9. Sentinel spring-cloud-gateway adapter(1.6)异常错误之@EnableCircuitBreaker

    sentinal 大坑 使用gateway adaper包出现@EnableCircuitBreaker did you forget include starter的异常 这时候千万不要学我引入cl ...

  10. DLM分布式锁的实现机制

    1.AST简介 DLM进程(LMON.LMD)之间的跨实例通信是使用高速互联上的IPC层实现的.为了传递锁资源的状态,DLM使用了异步陷阱(AST),它在操作系统处理程序例程中实现为中断.纯粹主义者可 ...