8 文件操作

文件操作
一.路径
1. 绝对路径(当文件路径是固定的时候)
从磁盘根目录找文件。 windows下用的就是c,d,e,f, linux: \user\bin\xxxx
2. 相对路径(用的多)
相对路径相对于当前程序所在的文件夹
../ 表示上一层文件夹

\n \t 转义字符。 有固定的含义的。 推荐用r
f = open(r"E:\哈哈\t\n\老师.txt", mode="r", encoding="utf-8")


二.文件读写取 "r" 只读 w只写
open()出来的结果可以使用read或者write. 根据mode来看
1.读 r
方式一:f=open(文件名路径,mode="r",encoding="utf-8")
f.read(3)
f.close()
方式二:with open(文件名路径,mode="r",encoding="utf-8") as f:
f.read(3) 读3给字符
1.f.readline() 读一行
2.for line in f: #循环一行一行读 重点 文件句柄f 为可迭代对象
print(line.strip())
3.f.read() 全部读取出来
4.f.readlines() 全部读取出来

2.写 w 先清空里面的内容. 然后再写入
f = open("taibai", mode="w", encoding="utf-8") # w可以帮我们创建文件
f.write(写的内容)

3.追加写入 a
f = open("taihei", mode="a", encoding="utf-8")
f.write("太黑\n")

r+ 读写, w+ 写读, a+ 追加写读, r+b, w+b, a+b
+ 表示扩展
4. r+,
# 正常的
f = open("person", mode="r+", encoding="utf-8")
content = f.read()
f.write("黄蓉")
print(content)

# 错误的示范
f = open("person", mode="r+", encoding="utf-8")
f.write("杨千桦") # 默认如果直接写入的话。 在开头写入。 覆盖开头的内容
content = f.read()
print(content)

# r+
# 坑: 不论你读取多少内容。再次写入的时候都是在末尾
f = open("person", mode="r+", encoding="utf-8")
info = f.read(3)
f.write("胡辣汤")
print(info)

5 w+
f = open("person", mode="w+", encoding="utf-8") # 先清空。 然后再操作
f.write("你好。 我叫肿瘤君")
content = f.read() # 写入东西之后。 光标在末尾。 读取不到内容的
print(content)
f.close()

三.文件的复制
1.文本文件的复制
f1 = open(r"c:\日记本.txt", mode="r", encoding="utf-8")
f2 = open(r"d:\日记本.txt", mode="w", encoding="utf-8")
for line in f1: # 从f1中读取数据
f2.write(line) # 写入到f2中
f1.close()
f2.close()

2.非文本文件复制
b - bytes 读取和写入的是字节 , 用来操作非文本文件(图片, 音频, 视频)
rb, wb, ab
把胡一菲图片文件从c盘复制到d盘, 单纯的从bytes角度来复制的。适用于所有文件
f1 = open(r"c:\胡一菲.jpg", mode="rb")
f2 = open(r"d:\胡二非.jpg", mode="wb")
for line in f1: # 分批量的读取内容
f2.write(line)
f1.close()
f2.close()

四.文件的修改
with open(xxx) as f1, \
open(xxxxx)as f2
不用手动关闭文件句柄

文件修改的步骤
1. 从源文件中读取数据。
2. 写入到副本文件中
3. 删除源文件
4. 把副本重命名成源文件
import os
os.remove()
os.rename()

例子
import os #导入os模块
with open("唐诗", mode="r", encoding="utf-8") as f1,\
open("唐诗_副本", mode="w", encoding="utf-8") as f2:
for line in f1:
line = line.replace("善良", "sb")
f2.write(line)
os.remove("唐诗") # 删除源文件
os.rename("唐诗_副本", "唐诗") # 把副本改名成源文件

五. 相关操作
1. seek()移动光标(重点)
seek(0) 开头
seek(0,2) 移动到末尾
2. tell() 获取光标所在的位置
3. truncate() 截断文件
f = open("person", mode="r", encoding="utf-8")
info = f.read(3) # 读取三个字符
#seek()移动光标

#李杰是一个大烧饼
f.seek(3) # 以字节为单位
info = f.read(3) # 读取三个字符

# seek(参数1, 参数2)
# 参数1表示的是偏移量,移动多少个单位
# 参数2表示从什么位置进行偏移
# 0: 开头
# 1: 当前位置
# 2: 末尾

# 把光标移动到文件的开头: seek(0)
# 把光标移动到末尾: seek(0, 2)

print(f.read(2)) # 读取两个字符。
f.seek(0)   # 回到开头
print(f.read(2))    # 读取两个字符

print(info)

# tell() 程序返回当前光标的位置
info = f.read(3)
print(info)
print(f.tell()) # 获取光标位置

# truncate() 截断文件. 慎用

# 尽量不要瞎测试, w, w+
f = open(r"C:\Program Files (x86)\Tencent\QQ\Bin\QQScLauncher.exe", mode="r+", encoding="utf-8")
f.seek(5) # 光标移动到5
f.truncate() # 默认从开头截取到光标位置
# f.truncate(3) # 从头截取到3
f.close()
View Code

 六.文件操作运用

应用一:

1,文件内容:每一行内容分别为商品名字,价钱,个数。

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=[]
with open("a.txt","r",encoding="utf-8") as f:
    for line in f:
        dic={}
        li2=line.strip().split(" ")
        dic["name"]=li2[0]
        dic["price"]=li2[1]
        dic["amount"]=li2[2]
        li.append(dic)
print(li)
sum=0
for i in li:
    sum=sum+int(i['price'])
print(sum)
应用一

 

应用二:

序号     部门      人数      平均年龄      备注
1       python    30         26         单身狗
2       Linux     26         30         没对象
3       运营部     20         24         女生多

.......

通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
......]

#去""的函数
li=[]
def qu_kong(li):
    li2 = []
    for i in li:
        if i != "":
            li2.append(i)
    return li2
with open("作业6","r",encoding="utf-8") as f:
    #让首行,先读取
    li2=qu_kong(f.readline().strip().split(" "))
    # 用循环打印首行之后的每一行
    for line in f:
        dic={}
        line=qu_kong(line.strip().split(" "))
        for i in range(len(li2)):
            dic[li2[i]]=line[i]
        li.append(dic)
print(li)

  

posted @ 2018-10-26 14:18  冰底熊  阅读(221)  评论(0编辑  收藏  举报