day 08 文件操作

文件操作

1.文件操作

     格式 :  

        open 打开
        f = open(文件路径, mode="模式", encoding="编码格式") 最最底层操作的就是bytes

 

 

 

文件句柄是一个可迭代对象

优点:

  相对来说节省内存, 操作相对简单

for line in f: # 从文件中读取到每一行给前面的line
print(line.strip())
f.close()

 

 

 

 

绝对路径:
    从磁盘根目录开始寻找

f = open("E:\西游记\金角大王吧.txt", mode="r", encoding="gbk")
print(f.read())
f.close()

 


相对路径:
    相对于当前程序所在的文件夹      ../ 上一层文件      文件夹/ 进入xxx文件夹

 

r: read 只读
f = open("alex和wusir的故事", mode="r", encoding="utf-8")
读取内容
content = f.read()  # 全部都读取出来
print(content)

坑:
c2 = f.read() # 读取不到内容. 因为上面已经读取完毕. 光标在末尾
print("c2", c2)

良好的习惯
f.close() # 关闭连接

 

 

 

 

读写文件时的良好习惯:

              f1.close()        2.flush()       f2.close()

 

2.mode

1. read()
默认: 读取文件内容(全部)
read(n) 读取n个字符

 

2. readline() 读取一行

 

3. readlines() 读取全部. 返回列表

 

 

 

r: 读取,只读.
读取文件的相关操作

 

w:
写入. 只写
创建文件
会清空文件

 

a:
也可以创建文件
追加写

 

r+: 对于文件而言. 应该有的操作就两个:读, 写
读写操作

 

w+:
写读操作

 

a+:
追加写读

 

 

 

所有带b的表示直接操作的是bytes, 当处理非文本文件的时候.
rb
wb

 

ab: 断点续传

 

r+b
w+b
a+b

 

 

3. 文件操作中关于文件句柄的相关操作            

 

seek() 移动光标

 

tell
返回光标所在的位置(返回的位置是以字节的形式)

 

truncate()   截断内容


f.seek(0) 移动到开头(最多)


f.seek(0, 2) 移动到末尾

f = open("胡辣汤", mode="r+", encoding="utf-8")
f.seek(0,2) # 移动到末尾
content = f.read(5)
print(content)
f.seek(0) # 移动到开头
print(f.read())
print(f.tell())  # 字节

f.seek(3)
print(f.read())

 

seek:

   根据字节数来判断位置

1. 表示偏移量
2. 从xxx开始偏移, 默认0, 开头 1 当前位置, 2 末尾

 

f.flush() 刷新管道把数据写入文件

 

f.close() 在对文件读取或者写入操作完毕时关闭文件

 

 

 

 

 

4. 文件修改, 实际操作

mode "r"

f = open("小护士模特主妇萝莉.txt", mode="r", encoding="utf-8")
print(f.read(5))  # 读取5个字符
print(f.read(5))  # 继续读5个

print(f.readline().strip()) # 换行符为分割, strip()可以去掉换行. 读取到的内容第一件事就是去掉空白         
print(f.readline()) # 换行符为分割

f.close()

 

 

 

mode "w"

每次用w模式打开文件, 都会清空这个文件(坑)

 

f = open('胡辣汤', mode="w", encoding="utf-8") # 可以帮我们创建文件

f.write('河南特色\n')
f.write("东北特色\n")
f.write('陕西特色\n')

# 好习惯
f.flush()  # 刷新管道, 把数据写入文件
f.close()

 

 

 

 

mode "a"

a, append 追加, 在文件的末尾写入内容(保留前面的内容,如果没有文件默认创建)

f = open("葫芦小金刚", mode="a", encoding="utf-8") # a, append 追加, 在文件的末尾写入内容
f.write("你叫什么名字啊?")
f.read() # not readable
f.flush()
f.close()

 

 

mode "r+"

 

f = open("葫芦小金刚", mode="r+", encoding="utf-8")
content = f.read(2)  # 顺序必须先读, 后写
# r+特有的深坑:不论读取内容的多少. 只要你读了. 写就是在末尾
f.write('五娃')
print(content)

 

 

 

 

mode "w+"

一上来会清空文件,没人会用

 

f = open("葫芦小金刚", mode="w+", encoding="utf-8")
content = f.read(2)  # 顺序必须先读, 后写
# # r+特有的深坑:不论读取内容的多少. 只要你读了. 写就是在末尾
f.write('五娃')
f.write("又能吐火的, 有能吐水的.")
# 移动光标
f.seek(0) # 移动到开头
s = f.read()
print("=========>", s)

 

 

 

 

mode "a+"

 追加写读, 光标在末尾. 所有的写都是在末尾

 

f = open("葫芦小金刚", mode="a+", encoding="utf-8")
f.write("机器葫芦娃召唤神龙, 高喊.我代表月亮消灭你!")
f.seek(0)
s = f.read()
print("=========>", s)

 

 

 

 

例1:  ↓

文件复制

 

f1 = open("c:/huyifei.jpg", mode="rb")
f2 = open("d:/huerfei.jpg", mode="wb")

for line in f1: # line是从f1中读取的内容
    f2.write(line)  # 把读取的内容原封不动的写出去

f1.close()
f2.flush()
f2.close()

 

 

 

 

 

 

例2:  ↓

替换

需求: 把好人换成sb

必须:

  1. 先从文件中读取内容
    2. 把要修改的内容进行修改
    3. 把修改好的内容写人一个新文件
    4. 删除掉原来的文件
    5. 把新文件重命名成原来的文件的名字
 

# 导入os模块  os表示操作系统
import os

写法1
f = open("夸一夸alex", mode="r", encoding="utf-8")
 f2 = open("夸一夸alex_副本", mode="w", encoding="utf-8")


写法2
# with会自动的帮我们关闭文件的链接
with open("夸一夸alex", mode="r", encoding="utf-8") as f, \
     open("夸一夸alex_副本", mode="w", encoding="utf-8") as f2:

    for line in f:
        if "好人" in line:
            line = line.replace("好人", "sb")
        f2.write(line)

# time.sleep(3) # 程序暂停3秒

# 删除原来文件
os.remove("夸一夸alex")

# 重命名副本为原来的文件名
os.rename("夸一夸alex_副本", "夸一夸alex")

 

 

例3:  ↓

水果统计

1.

f = open("水果.txt", mode="r", encoding="utf-8")

lst = []      
for line in f:  # 1,香蕉,1.85,50                                     
    dic = {}  # 每行都是一个字典
    line = line.strip()  # 去掉空白  \n 1,香蕉,1.85,50
    a, b, c, d = line.split(",") # [1, 香蕉, 1.85, 50]
    dic['id'] = a
    dic['name'] = b
    dic['price'] = c
    dic['totle'] = d
    lst.append(dic)

print(lst)

模板: 水果.txt

1,香蕉,1.85,50
2,苹果,2.6,100
3,榴莲,25,800
4,木瓜,3.5,10000



 

 2.

f = open("水果.txt", mode="r", encoding="utf-8")
line = f.readline().strip() # 第一行内容,   编号,名称,价格,数量,哈哈
h,i,j,k = line.split(",")
lst = []
for line in f:  # 1,香蕉,1.85,50
    dic = {}  # 每行都是一个字典
    line = line.strip()  # 去掉空白  \n 1,香蕉,1.85,50
    a, b, c, d = line.split(",") # [1, 香蕉, 1.85, 50]
    dic[h] = a
    dic[i] = b
    dic[j] = c
    dic[k] = d
    lst.append(dic)

print(lst)

模板:水果.txt

编号,名称,价格,数量
1,香蕉,1.85,50
2,苹果,2.6,100
3,榴莲,25,800
4,木瓜,3.5,10000

 

3.动态添加

f = open("水果.txt", mode="r", encoding="utf-8")
line = f.readline().strip() # 第一行内容,   编号,名称,价格,数量,哈哈
title = line.split(",") # [编号,名称,价格,数量,哈哈]
lst = []
i = 0

for line in f:  # 1,香蕉,1.85,50
    dic = {}  # 每行都是一个字典
    line = line.strip()  # 去掉空白  \n 1,香蕉,1.85,50
    data = line.split(",") # [1, 香蕉, 1.85, 50]

    for i in range(len(title)):
        dic[title[i]] = data[i]

    lst.append(dic)

print(lst)

模板:水果.txt

编号,名称,价格,数量,哈哈
1,香蕉,1.85,50,60
2,苹果,2.6,100,70
3,榴莲,25,800,80
4,木瓜,3.5,10000,90

 

posted @ 2018-12-06 10:34  jack_zhangn`  阅读(117)  评论(0编辑  收藏  举报