Python 文件操作

主要包含以下内容

1. 初识文件操作

2. 只读(r, rb)

3. 只写(w, wb)

4. 追加(a, ab)

5. r+读写

6. w+写读

7. a+写读(追加写读)

8. 其他操作⽅法

9. 文件的修改以及另一种打开文件句柄的方式

  一. 初识⽂文件操作   

     使⽤用python来读写⽂件是非常简单的操作. 我们使⽤用open()函数来打开⼀个⽂文件, 获取到文 件句柄. 然后通过⽂件句柄就可以进⾏各种各样的操作了了. 根据打开方式的不同能够执⾏行的操作也会有相应的差异.     打开文件的⽅方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤用的是r(只读)模式

f = open("123.txt",mode="r", encoding="utf-8")
content = f.read()
print(content)
f.close()

需要注意encoding表⽰示编码集. 根据⽂文件的实际保存编码进⾏行行获取数据, 对于我们⽽而⾔言. 更更 多的是utf-8


rb. 读取出来的数据是bytes类型, 在rb模式下. 不能选择encoding字符集.

f = open("123.txt" ,mode = "rb")
content = f.read()
print(content)
f.close()

rb的作⽤用: 在读取非⽂文本⽂文件的时候. 比如读取MP3. 图像. 视频等信息的时候就需要⽤用到 rb. 因为这种数据是没办法直接显⽰示出来的.  在后⾯面我们⽂文件上传下载的时候还会⽤用到. 还有.
我们看的直播. 实际上都是这种数据.

绝对路路径和相对路路径:

     1. 绝对路路径:从磁盘根⽬目录开始⼀一直到⽂文件名.

      2. 相对路路径:同⼀一个⽂文件夹下的⽂文件. 相对于当前这个程序所在的⽂文件夹⽽而⾔言. 如果在同 ⼀一个⽂文件夹中. 则相对路路径就是这个⽂文件名. 如果在上⼀一层⽂文件夹. 则要../

                          微信图片_20190103183021

读取文件的方法:

1. read()     将⽂文件中的内容全部读取出来. 占内存. 易导致内存崩溃

2. read(n)    读取n个字符.   如果再次读取.  会在当前位置继续去读⽽而不 是从头读, 如果使⽤用的是rb模式. 则读取出来的是n个字节

3. readline() ⼀次读取⼀一⾏行数据,  注意每次读取出来的数据都会有⼀ 个\n . 需要我们使⽤用strip()⽅法来去掉\n或者空格

4. readlines()将每⼀⾏行形成一个元素, 放到一个列表中. 将所有的内容都读取出来. 易出现内存崩溃的问题

5. 循环读取.   这种⽅方式是组好的. 每次读取⼀⾏行内容.不会产生内存溢出的问题.

下面分别演示:

1 read()     将⽂文件中的内容全部读取出来

f = open("123.txt" ,mode = "r" , encoding="utf-8")
content = f.read()  # 默认将文件中的内容全部读取出来
print(content)
f.close()
结果如下:
CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.
会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现.
质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。
他还说,他“事实上”是开除了马蒂斯。

2 read(n)    读取n个字符.   如果再次读取.  会在当前位置继续去读而不 是从头读, 如果使⽤用的是rb模式. 则读取出来的是n个字节

f = open("123.txt" ,mode = "r" , encoding="utf-8")
content = f.read(10)
print(content)
content = f.read(10)  #如果再次读取.  会在当前位置继续去读而不 是从头读, 如果使⽤用的是rb模式. 则读取出来的是n个字节
print(content)

结果如下:
CNN援引这名美国官
员的话说,沙纳汉当天

3 readline() ⼀次读取⼀一⾏行数据,  注意每次读取出来的数据都会有⼀ 个\n . 需要我们使⽤用strip()⽅法来去掉\n或者空格

f = open("123.txt", mode="r", encoding="utf-8")
content = f.readline()              # 按行读出,若括号内有数字,代表只读每行x个字符
print(content)
content1 = f.readline()              # 按行读出,若括号内有数字,代表只读每行x个字符
print(content1)
content2 = f.readline().strip()       # 按行读出,若括号内有数字,代表只读每行x个字符,我们使⽤用strip()⽅法来去掉\n或者空格
print(content2)
content3 = f.readline()               # 按行读出,若括号内有数字,代表只读每行x个字符
print(content3)

结果如下:
CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.

会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现.

质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。
他还说,他“事实上”是开除了马蒂斯。

4 readlines()将每⼀⾏行形成一个元素, 放到一个列表中. 将所有的内容都读取出来. 易出现内存崩溃的问题.不推荐使用,且列表自带换行符号\n

f = open("123.txt", mode="r", encoding="utf-8")
cont = f.readlines()                         # 亲测 汇总为一个列表元素
print(cont)
f.close()
f = open("123.txt", mode="r", encoding="utf-8")
cont1 = f.readlines(1)                        # 亲测 只识别1行,2行为列表做不到
print(cont1)

结果如下:
['CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.\n', '会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现.\n', '质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。\n', '他还说,他“事实上”是开除了马蒂斯。']
['CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.\n']

5 循环读取.   这种⽅方式是组好的. 每次读取⼀⾏行内容.不会产生内存溢出的问题. 读取文件一定要最终 f.close()

f = open("123.txt", mode="r", encoding="utf-8")
lst1 = []
for line in f:
    lst1.append(line.strip())  # 清除换行符,并添加到lst1 中
    print(line.strip())
print(lst1)

结果如下:
CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.
会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现.
质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。
他还说,他“事实上”是开除了马蒂斯。
['CNN援引这名美国官员的话说,沙纳汉当天早些时候先出席了特朗普的一个内阁会议.', '会上特朗普批评了前任防长马蒂斯在叙利亚和阿富汗的工作表现.', '质问“他为我做了什么?他在阿富汗做了什么?不怎么样,不怎么样,我对他在阿富汗的表现不满意,我也不应该满意”。', '他还说,他“事实上”是开除了马蒂斯。']

写模式

写的时候注意. 如果没有⽂文件. 则会创建⽂文件, 如果⽂文件存在. 则将原件中原来的内容删除, 再 写入新内容

f = open("123.txt", mode="w" ,encoding="utf-8")
f.write("国家铁路局局长杨宇栋调任中国铁路总公司(下称中铁总)任总经理,现任中国铁路总公司党组书记、总经理陆东福改任中铁总董事长。中国铁路总公司1月2日下午在全路工作会议上宣布上述任命。接近中铁总人士今日对《中国经营报》记者确认上述消息")
f.flush()  # 刷新 好习惯 wb模式下. 可以不指定打开⽂文件的编码. 但是在写⽂文件的时候必须将字符串串转化成utf-8的 bytes数据
f = open("123.txt", mode="r", encoding="utf-8")
content = f.read()  # 写的时候注意. 如果没有⽂文件. 则会创建⽂文件, 如果⽂文件存在. 则将原件中原来的内容删除, 再 写入新内容
print(content)

结果如下:
国家铁路局局长杨宇栋调任中国铁路总公司(下称中铁总)任总经理,现任中国铁路总公司党组书记、总经理陆东福改任中铁总董事长。中国铁路总公司1月2日下午在全路工作会议上宣布上述任命。接近中铁总人士今日对《中国经营报》记者确认上述消息

追加(a, ab)

在追加模式下. 我们写入的内容会追加在⽂文件的结尾.

f = open("123.txt", mode="a" ,encoding="utf-8")
f.write("该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。")
f.flush()
f.close()
f = open("123.txt", mode="r" ,encoding="utf-8")
content = f.read()
print(content)

结果如下:
国家铁路局局长杨宇栋调任中国铁路总公司(下称中铁总)任总经理,现任中国铁路总公司党组书记、总经理陆东福改任中铁总董事长。中国铁路总公司1月2日下午在全路工作会议上宣布上述任命。接近中铁总人士今日对《中国经营报》记者确认上述消息该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。

读写模式(r+, r+b)

对于读写模式. 必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了之后再进⾏行行 写入. 我们以后使⽤用频率最高的模式就是r+

f = open("123.txt", mode="r+" ,encoding="utf-8")
content = f.read()
f.write("11")                                    #正常的读取之后, 写在结尾
f.flush()                                         # 刷新 好习惯
print(content)

结果如下:
国家铁路局局长杨宇栋调任中国铁路总公司(下称中铁总)任总经理,现任中国铁路总公司党组书记、总经理陆东福改任中铁总董事长。中国铁路总公司1月2日下午在全路工作会议上宣布上述任命。接近中铁总人士今日对《中国经营报》记者确认上述消息该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。该人士称,人事任命后,中铁总即将进入更名倒计时,新名称为,中国国家铁路集团有限公司,“昨日的会议上并没有宣布更名”,他说。中国铁路总公司股份制改造后将设董事会。杨宇栋继任后,国家铁路局副局长于春孝暂时负责国家铁路局工作。11

写读(w+, w+b)

先将所有的内容清空. 然后写入. 最后读取. 但是读取的内容是空的, 不常⽤用, w+ 模式下, ⼀一开始读取不到数据. 然后写的时候再将原来, 的内容清空. 所以, 很少⽤

f = open("123.txt", mode="w+" ,encoding="utf-8")
f.write("11")                                    #正常的读取之后, 写在结尾
content = f.read()
f.flush()                                         # 刷新 好习惯
print(content)

结果


追加读(a+)

a+模式下, 不论先读还是后读. 都是读取不到数据的.

f = open("123.txt", mode="a+" ,encoding="utf-8")
f.write("11")                                    #正常的读取之后, 写在结尾
content = f.read()
f.flush()                                         # 刷新 好习惯
print(content)
f.close()

结果




其他操作- 光标移动

seek(n) 光标移动到n位置,  注意, 移动的单位是byte. 所以如果是UTF-8的中⽂文部分要 是3的倍数

通常我们使⽤用seek都是移动到开头或者结尾.

  • 移动到开头: seek(0)
  • 移动到结尾: seek(0,2)  seek的第⼆二个参数表⽰示的是从哪个位置进⾏行行偏移, 默认是0,  表 ⽰示开头, 1表⽰示当前位置, 2表⽰示结尾

f.tell() 使⽤用tell()可以帮我们获取到当前光标在什么位置

f.truncate() 截断⽂文件,后⾯面的所有内容全部都删掉

深坑请注意: 在r+模式下. 如果读取了了内容. 不论读取内容多少. 光标显⽰示的是多少. 再写入 或者操作⽂文件的时候都是在结尾进⾏行行的操作.


修改⽂文件以及另⼀一种打开⽂文件的⽅方式 

  • ⽂文件修改: 只能将⽂文件中的内容读取到内存中, 将信息修改完毕, 然后将源⽂文件删除, 将新 ⽂文件的名字改成老⽂文件的名字.


import os
with open("123", mode="r", encoding="utf-8") as f1, open("123_new", mode="w", encoding="utf-8") as f2:
    for line in f1:
        new_line = line.replace("你好", "中国")
        f2.write(new_line)
os.remove("123")  # 删除源⽂文件
os.rename("123_new", "123")  # 重命名新⽂文件  # 将前面的名字 改为后面 的 名字
f  = open("123", mode="r", encoding="utf-8")
content = f.read()
print(content)

结果如下:
中国

转载于:https://www.cnblogs.com/rango0550/p/10216458.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值