python 的基础学习 第九天 文件的操作

1,文件操作

参数:1,文件路径  2,编码方式,3,执行动作(打开方式),只读,只写,,读写,追加和读写。

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

f = open('yuyu',encoding='gbk',mode='r')
#可以设f变量,f_obj,file,f_handler.....等文件句柄。
s = f.read()
print(s)
f.close()

open是windows的系统功能,windows的默认编码方式是gbk,linux操作系统默认为utf-8。

流程:打开一个文件,产生一个句柄,对文件句柄进行操作,然后关闭。

读:r只读

1,文件以什么编码存储的就以什么编码方式打开。

2,文件路径:绝对路径,从根目录开始一级一级查找直到找到。

                         相对路径,在同一文件夹下直接写文件。

五种方式:

1,f.read,全部读出来。只读模式,可以不注明。默认就是只读模式。

f=open('yu.bak',encoding='utf-8')

2,f.readline,一行一行的读取。

3,f.readlines将原文件的每一行作为一个列表的元素读取。

4,f.read(n)在r模式下按照字符读取。n=(字符数)

                      在rb模式下read(n)按照字节读取。rb模式只读以bytes类型,非文字类的文件时用rb

5,循环读取。这种方式最好,占内存少。

f = open('yu','r',encoding='utf-8')
for i in f:
    print(i.strip())
f.close()

写:w,write写模式

f = open('bk',encoding='utf-8',mode='w')
f.write('常常激励自己')
f.close()

w 写模式,没有文件时创建一个文件写入内容,有文件,将原文件内容清空,再写入内容。

#1. 打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】

#2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
rb 
f=open('yu.bak',mode='rb')
s= f.read(6)
print(s)
f.close()#b'alex\xe6\x98'

 

wb
f = open('yu',mode='wb')
f.write('李海娜'.encode('utf-8'))
f.close()

 

ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

#3,‘+’模式(就是增加了一个功能)
r+, 读写【可读,可写】
w+,写读【可写,可读】
a+, 写读【可写,可读】

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

  

1. 文件打开方式为文本模式时,代表读取3个字符

  2. 文件打开方式为b模式时,代表读取3个字节

其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

注意:

  1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的

 

  2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果。

f = open('yu','r+',encoding='utf-8')
s = f.truncate(4)
print(s)
f.close()

2,文件的修改

# ① 创建一个新的文件
# ② 读取一个原文件
# ③ 将原文件的内容通过你想要的方式进行更改并写入新文件
# ④ 将原文件删除
# ⑤ 将新文件重命名

with 语句:

1,功能一自动关闭文件句柄。2,一次性操作多个文件 。

# import os
# with open('yu',encoding='utf-8')as f1,\
#     open('yu.bak',encoding='utf',mode='w')as f2:
#     content = f1.read()
#     new_content = content.replace('SB','alex')
#     f2.write(new_content)
# os.remove('yu')
#os.rename('yu.bak','yu')

 

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}......] 并计算出总价钱。

li = []
name_list = ['name','price','amount','year']
with open('a.txt',encoding='utf')as f1:
    for i in f1:
        l2 = i.strip().split()
        dic = {}
        for j in range(len(l2)):
            dic[name_list[j]] = l2[j]
        li.append(dic)
print(li)
sum = 0
for i in li:
    sum1 = int(i['price'])*int(i['amount'])
    sum += sum1
print(sum)

 

2,有如下文件:

-------

alex是老男孩python发起人,创建人。

alex其实是人妖。

谁说alex是sb?

你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。

----------

将文件中所有的alex都替换成大写的SB。

import os 
with open('a1.txt',encoding='utf-8')as f1,\
    open('a.txt',encoding='utf-8',mode='w')as f2:
    for i in f1:
        new_i = i.replace('alex','SB')
        f2.write(new_i)
os.remove('a1.txt')
os.rename('a1.txt','a.txt')

 

posted @ 2018-03-27 18:53  大叔级别  阅读(207)  评论(0编辑  收藏  举报