1.6-python基础文件操作-编码


文件操作

初始文件操作

用python开操作文件,需要的参数:

  1. 文件路径
  2. 编码方式
  3. 操作模式:只读,只写,追加,读写
f = open(r'D:\赵贺学习python\我爱学习学习使我快乐', mode='r', encoding='utf-8')
content = f.read()
print(content)
f.close()
解释:
f:	变量,文件句柄;
open:	是python调用的操作系统(windows,linux等)的功能;
D:\赵贺学习python\我爱学习学习使我快乐:	文件的路径;
mode:	定义操作方式:r为读模式;
encoding:	声明编码或解码
f.read():	操作文件,通过文件句柄进行操作;
f.close():	关闭文件句柄(必须主动关闭)

操作文件的流程:
1.打开文件,得到文件句柄并赋值给一个变量;
2.通过句柄对文件进行操作;
3.关闭文件;

文件操作模式:读, 写, 追加

文件操作:读

r模式:

以只读方式打开文件,文件的指针会放在文件的开头。默认模式,如果不设置mode,默认使用r模式操作文件;

# read() 将文件内容全部读取出来;弊端:如果文件很大就会非常占用内存,容易导致内存崩溃
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
msg = f.read()
f.close()
print(msg)
# 这种方式一次读取出来了
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
msg1 = f.read(2)
msg = f.read()
f.close()
print(msg)
print(msg1)
# read()读取的时候指定读取到什么位置,在r模式下,n按照字节读取

readline()读取每次只读取一行,readline()读取出来的数据后都有一个\n,加strip()脱掉

f = open('学习文件模式.txt', mode='r', encoding='utf-8')
msg1 = f.readline().strip()
msg2 = f.readline().strip()
msg3 = f.readline().strip()
f.close()
print(msg1)
print(msg2)
print(msg3)
# readlines() 返回一个列表,列表里的每一个元素是原文件的每一行,如果文件很大,占内存,容易崩溃
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
msg = f.readlines()
f.close()
print(msg)

for循环

# 可以通过for循环去读取,文件句柄是一个迭代器,特点就是每次循环只在内存中占一行的数据,非常节省内存;
f = open('学习文件模式.txt', mode='r', encoding='utf-8')
for line in f:
    print(line)
f.close()
# ps.读完的文件句柄一定要关闭

rb模式

rb模式:以二进制格式打开一个文件,用于只读。主要操作对象是非文件内容:图片,音频,视频等。如果用带b的模式操作文件,不用声明编码方式;

如果文件不存在,利用w模式操作文件,会先创建文件,然后写入内容;

如果文件存在,利用w模式操作文件,会先清空原文件内容,再写入新内容;

wb模式:以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,原有内容会被删除。一般也用于非文本文件;

举例:以rb模式将一个图片的内容以bytes类型全部读取出来,然后再以wb将全部读取出来的数据写入一个新文件,就完成了一个类似图片复制的流程:

# step1:将图片以rb模式读取出来
f = open('1.jpg', mode='rb')
content = f.read()
f.close()

# step2: 将读取出来的数据通过wb模式写入新文件
f1 = open('2.jpg', mode='wb')
f1.write(content)
f1.close()

文件的追加

a模式:打开一个文件用于追加,如果文件存在,指针放在文件的结尾;如果不存在,就创建新文件进行写入;

文件的操作模式

1.打开文件的模式
r,只读模式
w,只写模式
a,只追加模式

# 对于非文本文件
rb
wb
ab
# 不能指定编码

# +模式
r+, 读写
w+, 写读
a+, 写读
# r+模式,文件指针会默认放在文件的开头。度过在读写模式下,先写后读,文件就会出现问题;

# 以bytes类型操作的模式
r+b, 读写
w+b, 写读
a+b, 写读

文件的另一种打开方式

with open() as ...

不需要手动关闭文件句柄

with open('学习文件模式.txt', encoding='utf-8') as f:
    f.read()

with open('学习文件模式.txt', encoding='utf-8') as f1,\
        open('我爱学习学习使我快乐', encoding='utf-8', mode='w') as f2:
    f1.read()
    f2.write('黑色利穆')

文件的修改

文件的数据是放在硬盘上的,因而只存在覆盖,不存在修改;平时看到修改的文件都是模拟出来的效果,实现方法:

方法一:将硬盘存放该文件的内容全部加载到内存,在内存中修改,修改完毕后,再由内存覆盖到硬盘;(word,vim,nodpad)

import os
with open('学习文件模式.txt', encoding='utf-8') as read_f, \
        open('.学习文件模式.txt', 'w', encoding='utf-8') as write_f:
    data = read_f.read()    # 全部读入内存,如果文件很大,会很卡
    data = data.replace('爱我中华', '我爱祖国')     # 在内存中完成修改
    write_f.write(data)     # 一次性写入新文件
os.remove('学习文件模式.txt') # 删除源文件
os.rename('.学习文件模式.txt', '学习文件模式.txt')      # 将新建的文件重命名为源文件

方法二:将硬盘存放在该文件的内容一行一行的读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

import os
with open('学习文件模式.txt', encoding='utf-8') as read_f, \
        open('.学习文件模式.txt', 'w', encoding='utf-8') as write_f:
    for line in read_f:
        line = line.replace( '我爱祖国', '爱我中华')
        write_f.write(line)
os.remove('学习文件模式.txt') # 删除源文件
os.rename('.学习文件模式.txt', '学习文件模式.txt')      # 将新建的文件重命名为源文件

练习

'''
1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。
'''
b = '''apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
'''
# with open('a.txt', 'w', encoding='utf-8') as f:
#     f.write(b)
with open('a.txt', encoding='utf-8') as f:
    lst = []
    for line in f:
        line = line.strip().split(' ')
        line = ({'name': line[0], 'price': line[1], 'amount': line[2]})
        lst.append(line)
print(lst)

sum = 0
for i in lst:
    unit_price = (int(i['price']) * int(i['amount']))
    sum += unit_price
print('总价为:', sum)

'''
-------
heiselimu是世界上最帅的男人;
heiselimu其实也没那么帅;
你说heiselimu帅不帅
不管你们说heiselimu帅不帅,我就觉得他是最帅的
----------
将文件中所有的heiselimu都替换成大写的HSLM。
'''
b = '''
-------
heiselimu是世界上最帅的男人;
heiselimu其实也没那么帅;
你说heiselimu帅不帅
不管你们说heiselimu帅不帅,我就觉得他是最帅的
----------
'''
# with open('b.txt', 'w', encoding='utf-8') as f:
#     f.write(b)
import os
with open('b.txt', encoding='utf-8') as f_r, \
        open('.b.txt', 'w', encoding='utf-8') as f_w:
    for line in f_r:
        f_w.write(line.replace('heiselimu', 'HSLM'))
os.remove('b.txt')
os.rename('.b.txt', 'b.txt')

posted @ 2020-12-03 18:41  黑色利穆  阅读(124)  评论(0编辑  收藏  举报