python--中的文件操作

1.文件操作 

  把文件打开

open 打开
f = open ('文件路径',mode='模式',encoding='编码格式')
#打开一个文件操作的时候取到的是一个句柄

  读取的方法

. read()      将文件中的内容全部读取出来. 弊端: 占内存.如果文件过大,容易导致内存崩溃
. read(n) 默认:读去文件内容全部read(n) 读取n个字符 . readline() 一次读取一行数据 , 注意每次读出来的数据都会有一个\n 需要使用strip()去空格 . readlines() 读取全部. 返回列表,也容易出现内存崩溃的问题,不建议使用

for line in f: 每次读取一行内容
   print(line.strip())

 

  1.  只读( r , rb)    读取文件的相关操作

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

     rb的作用: 在读取非文本文件时,比如读取MP3.图像. 视频等信息的时候就需要用rb. 因为这种数据没办法直接显示出来

 

  2.  只写(w , wb)  

     w 写入,只写,如果没有文件会创建文件,文件存在会清空文件,再写入新的内容

     wb 模式下,可以不指定打开文件的编码.但是在写文件的时候必须将字符串转化成utf-8的bytes数据

  3.  追加(a ,ab)

     追加模式下,写入的内容会追加在文件的末尾. 追加写读所有带b的操作就是对bytes进行操作, 主要用于非文本文件的时候比如音频 图片 视频rbwb就适用这个

   可用于断点续传.

     a模式也可以创建文件

  4.  读写 (r+ , r+b)

     读写模式必须是先读,因为默认光标是在开头的

     r+ 模式下必须先读取再写入

  5.  写读 (w+ , w+b)

     先将所有的内容清空,然后写入.最后读取.但是读取的内容是空的,不常用

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

     a+模式下,不论是先读还是后读,都是读取不到数据的,因为追加之后光标在末尾,如果需要读取数据要移动光标seek

 

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

1. seek() 移动光标

seek:两个参数
1. 表示偏移量
2. 从xxx开始偏移, 默认0, 开头 1, 当前位置 2, 末尾

    f.seek(0) 移动到开头

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

 

2. tell()返回光标所在的位置

print(f.tell())

3. truncate() 截断文件

f = open("文件1", mode="w", encoding="utf-8")
f.write("哈哈") # 写入两个字符
f.seek(3) # 光标移动到3, 也就是两个字中间
f.truncate() # 删掉光标后面的所有内容
f.close()

f = open("文件1", mode="r+", encoding="utf-8")
content = f.read(3) # 读取12个字符
f.seek(4)
print(f.tell())
f.truncate() # 后面的所有内容全部删掉
# print(content)
f.flush()
f.close()

 

三.文件修改 

文件修改的步骤

  1.先从文件中读取数据

  2.把要修改的内容修改

  3.写入新文件

  4.删除旧文件

  5.给新文件改名

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

# f = open("夸一夸123", mode="r", encoding="utf-8")
# f2 = open("夸一夸123_副本", mode="w", encoding="utf-8")

# with会自动的帮我们关闭文件的链接
with open("夸一夸123", mode="r", encoding="utf-8") as f, \
     open("夸一夸123_副本", 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("夸一夸123")

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

 

一个重要的练习:

名字  数量 价格  数量
香蕉   1     85     50
苹果         2    60        30


编号,名称,价格
1,香蕉,1,85
2,苹果,2,6
要想获得这些数据


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)


# 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)



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)

 

posted @ 2018-12-05 19:59  robertx  阅读(280)  评论(0编辑  收藏  举报