文件操作简介:
使用python来读写文件是非常简单的操作.我们使用 open() 函数来打开一个文件,获取到文件句柄.然后
通过文件句柄就可以进行各种各样的操作了.根据打开⽅方式的不同能够执行的操作也会有相应的差异.
打开文件的方式: r, w, a, r+, w+, a+, rb, wb, ab, r+b, w+b, a+b 默认使⽤用的是r(只读)模式
相对路径 绝对路径:
绝对路径:从磁盘根目录开始寻找到文件目录 如:E:\Python_workspace\t\n\日历.txt
相对路径:从文件保存路径寻找,若在同一层文件夹中,则相对路径就是文件名,
若是上一层.则加上 ../ 以此类推
只读操作模式(r rb):

r  打开文件open() 读取第n个字符.read(n)
1 # r  打开文件open() 读取第n个字符.read(n)
2 f = open("操作文件.txt",mode="r",encoding="utf-8") # f 变量 操控文件的句柄
3 # 注意encoding表示编码集.根据文件的实际保存编码(windows默认为gbk)进行获取数据,常用utf-8
4 content = f.read(3) # 读取第三个字符
5 # content1 = f.read() # 一次性读取全部字符
6 print(content)
7 # print(content1)
8 f.close()
9 # 注意read(n)读取第n个字符,若再次读取时会在 当前位置继续 去读而不是从头去读取

      rb  常用于非文本文件 在rb模式下.不能选择encoding字符集.

1 # rb 常用于非文本文件 在rb模式下.不能选择encoding字符集.
2 f = open("../问题1.jpg",mode="rb")
3 content = f.read()
4 print(content) # 返回字节 b'\xff\xd8\xff\xe0\x00\x10JFIF\x00......'
5 f.close()
6 # read() 将文件内容全部读取出来 ,缺点:占内存,若文件过大容易导致崩溃
  readline() 读取一行数据
1 f = open("../王尼玛.txt",mode="r",encoding="utf-8")
2 s = f.readline() # 读取一行数据
3 print(s.strip()) # stirp() 去掉空白 空格 \t \n
4 f.close()

 

 

   readlines()将每一行形成一个元素,放到列表中.所有的内容都读取出来.容易出现内存崩溃的问题.

1 lis = f.readlines()  # 一次性全读取出,返回列表
2 lis1 = []
3 for i in lis:
4 lis1.append(i.strip())
5 print(lis1)
6 # readline() readlines()和read()一样 多次读取时不是从头开始 而是接着上面

  

  \n \t 转义字符有固定含义 推荐用 r 取消功能

1 f = open(r"E:\Python_workspace\t\n\666.txt",mode="r",encoding="utf-8")
2 print(f.read())
3 f.close()
read() readlines()都不推荐使用甚至是不使用,特别是在生产环境里!!
1 # read() readlines()都不推荐使用甚至是不使用,特别是在生产环境里!!
2 # 若需要读取 可通过 readline() 一次读取一行 以及循环读取
3 # 循环读取
4 # # 文件句柄是一个可迭代对象(必须掌握)
5 f = open("../王尼玛.txt",mode="r",encoding="utf-8")
6 for line in f: # 当成list读取文件内容 一行一行的读取 每次读的内容都交给前面的变量
7 print(line.strip())
8 f.close()
  注意读取完文件句柄一定要关闭 f.close()

  追加(a,ab)

1 # 只要是a或者ab,a+ 都是在文件的末尾写入.不论光标在任何位置.
2 f = open("../王尼玛.txt",mode="a",encoding="utf-8")
3 f.write("这是一只后入的王尼玛!")
4 f.flush()
5 f.close()
6 # ab a+ 模式下一样
# mode:
# r:只读
# w:写, 先清空里面的内容. 然后再写入
# a: 追加写入.

文件操作: w
  只写 w
  注意.写入时,若没文件.则会创建文件,如果文件存在.则将删除(首次)原内容,再写入新内容
1 f = open("哇哈哈.txt",mode="w",encoding="utf-8") # 创建新文件
2 f.write("哇哈哈,爽歪歪")
3 f.flush() # 刷新 养成好习惯
4 f.write(" 优酸乳,美滋滋啊") # 第二次write不会删除原内容 仅仅写入新内容
5 # f.read() # 只写模式 不能读取 报错 not readable
6 f.close() # 关闭句柄

  只写 字节 wb


 
1 # wb模式下.可不指定文件的编码.但在写文件时必须将字符串转化成utf-8的bytes数据
2 f = open("小屁孩.txt",mode="wb")
3 f.write("wusir".encode("utf-8")) # 写入时必须转化成bytes数据
4 f.flush()
5 f.close()

 

    文本文件的复制:

1 f1 = open(r"e:\Python_workspace\王尼玛.txt",mode="r",encoding="utf-8")
2 f2 = open(r"g:\王尼玛.txt",mode="w",encoding="utf-8")
3 for line in f1: # 从f1读取数据到变量
4 f2.write(line) # 写入到f2中(关于写入清空:清空只会在open打开再首次write时清空,这里显然不是)
5 f1.close()
6 f2.close()
7 #
8 # gbk utf-8 为文字编码 这里的复制方法只适用于文本
9 # 若是图片/视频/音频等需编码成bytes再操作,见下
  rb wb ab 把字符换成字节 仅此而已

  b - bytes 读取和写入的是字节,用来操作非文本文件(图片, 音频, 视频)
1 # 复制一张图片 从E盘到G盘,单纯的从bytes角度来复制(bytes适用于所有文件)
2 f = open(r"E:\Python_workspace\问题1.jpg",mode="rb")
3 f1 = open(r"g:\问题1.jpg",mode="wb")
4
5 for line in f: # 分批量读取bytes内容(复制的是 01 代码)
6 f1.write(line) # 因为f1的mode模式有w写入
7 f.close()
8 f1.close()

r+ 读写  w+ 写读  a+ 追加写读 :
# r+b 读写转换成字节  w+b 写读转换成字节  a+b 追加写读换成字节
# + 扩展
# r+ 读写 (较为常见的)
1 # 正确的操作 先读后写
2 f = open("person",mode="r+",encoding="utf-8")
3 content = f.read()
4 f.write("黄蓉")
5 print(content)
6 f.close()
7 # 正常的读取之后,写在结尾
1 # 错误的操作
2 f = open("person",mode="r+",encoding="utf-8")
3 f.write("赵敏") # 默认直接写入的话,在开头写入,会覆盖开头的内容
4 content = f.read()
5 print(content)
1 # 坑  不论读取多少内容,再次写入时都是在末尾
2 f = open("person",mode="r+",encoding="utf-8")
3 content1 = f.read(3)
4 f.write("郭芙")
5 print(content1)
6 f.close()
#  深坑请注意:在 r+ 模式下.如果读取内容.不论读取内容多少.显示的是多少.再写入或者操作文件时候都是在结尾进行的操作.

# w+ (几乎用不到)  (先清空再写入)
1 # w+ (几乎用不到)  (先清空再写入)
2 f = open("person",mode="w+",encoding="utf-8")
3 f.write("你好,世界") # 打开就写入会直接清空内容
4 content = f.read() # 写入内容后 光标在末尾 读取不了内容
5 print(content)
6 f.close()
# a+ (很少使用)   追加写读
1 # a+ (很少使用)   追加写读
2 # 不论光标在何处 写入的时候都是在末尾
3 f = open("person",mode="a+",encoding="utf-8")
4 f.write("东方不败") # 默认写在末尾
5 content = f.read()
6 print(content)
7 f.close()

光标 seek(参数1,参数2):

# seek(参数1,参数2)

# 参数1表示的是偏移量,移动多少个单位

# 参数2表示从什么位置进行偏移

# 0: 开头

# 1: 当前位置

# 2: 末尾


 

# 光标移动到n位置,注意移动的单位是byte,所以如果是utf-8中文部分则为3的倍数。

# 移动到开头:seek(0)

# 移动到结尾:seek(0,2)

1 f = open("person",mode="r",encoding="utf-8")
2 f.seek(0) # 以字节为单位
3 f.seek(2)
4 print(f.read(2)) # 读取两个字符
1 # tell() 返回当前光标的位置
2 info = f.read(3) # utf-8 3*3 9个字节
3 print(info)
4 print(f.tell()) # 获取光标的位置
# truncate() 截取截断文件(慎用)(特别服务器内)
1 f = open("person",mode="w",encoding="utf-8")
2 f.seek(3) # 光标移动到3
3 print(f.tell())
4 # f.truncate() # 后面所有内容都删掉
5 f.truncate(3) # 从头到3截取
6 f.close()

# 文件修改:

  固定模块 import.os

  os.remove()

  os.rename()

 1 import os  # 导入 os 模块
2
3 import time # 导入时间模块
4
5 # 优点: 不使用句柄,自动关闭连接
6 with open("唐诗",mode="r",encoding="utf-8") as f1,\
7 open("唐诗_副本",mode="w",encoding="utf-8") as f2:
8 for line in f1:
9 line = line.replace("与","yu")
10 f2.write(line)
11 time.sleep(3)
12 os.remove("唐诗") # 删除源文件
13 time.sleep(3)
14 os.rename("唐诗_副本","唐诗") # 把副本改名成源文件

# 文件操作应用练习:

# 把数据归类 增添数据时自动按格式排列
'''
1,榴莲,500,60000
2,苹果,700,70000
3,荔枝,600,60000
4,西瓜,800,70000
'''
1 # 1.
2 f = open(r"水果.txt",mode="r",encoding="utf-8")
3 lis = []
4 for line in f:
5 lis.append(line)
6 print(lis) # 没有清晰的分类 仅把每排关联数据作为一个元素装到了lis
7 # ['1,榴莲,500,60000\n', '2,苹果,700,70000\n', '1,榴莲,500,60000\n', '2,苹果,700,70000']
 1 # 2.
2 lis = []
3 # dic = {} # 循环 不可放在这里
4 f = open(r"水果.txt",mode="r",encoding="utf-8")
5 for line in f: # "1,苹果,500,60000"——》弄成字典效果——》{id:1,name:苹果, num:500, price:60000}
6 dic = {} # dic定义字典变量不可放在循环之前 否则只会有一个元素重复添加到lis
7 li = line.strip().split(",")
8 dic["id"] = li[0]
9 dic["name"] = li[1]
10 dic["num"] = int(li[2])
11 dic["price"] = int(li[3])
12 lis.append(dic)
13 print(lis)
14 f.close()
 1 # 3.若改动开头 第一行 id,name,price,num 以及在里面增添数据怎么写?
2
3 f = open(r"水果.txt",mode="r",encoding="utf-8")
4 title = f.readline().strip() # 读取第一行 id,name,price,num
5 lis = title.split(",") # 字符串分割成列表 ['id', 'name', 'price', 'num']
6 lis1 = []
7 for line in f:
8 dic = {}
9 li = line.strip().split(",")
10 for i in range(len(lis)):
11 dic[lis[i]] = li[i]
12 lis1.append(dic)
13 print(lis1) # [{'id': '1', 'name': '榴莲', 'price': '500', 'num': '60000'}, {'id': '2', 'name': '苹果', 'price': '700', 'num': '70000'}, {'id': '3', 'name': '荔枝', 'price': '600', 'num': '60000'}, {'id': '4', 'name': '西瓜', 'price': '800', 'num': '70000'}]
14 f.close()
15
16
17 '''
18 添加修改数据:
19 序号,名字,价格,数量,仓库
20 1,榴莲,500,60000,仓库01
21 2,苹果,700,70000,仓库02
22 3,荔枝,600,60000,仓库02
23 4,西瓜,800,70000,仓库03
24 '''
25 # 再次打印:
26 # [{'序号': '1', '名字': '榴莲', '价格': '500', '数量': '60000', '仓库': '仓库01'}, {'序号': '2', '名字': '苹果', '价格': '700', '数量': '70000', '仓库': '仓库02'}, {'序号': '3', '名字': '荔枝', '价格': '600', '数量': '60000', '仓库': '仓库02'}, {'序号': '4', '名字': '西瓜', '价格': '800', '数量': '70000', '仓库': '仓库03'}]
 

python对文件操作 r w a 文件复制/修改的更多相关文章

  1. 第九天- 文件操作 r w a 文件复制/修改

    文件操作简介:使用python来读写文件是非常简单的操作.我们使用 open() 函数来打开一个文件,获取到文件句柄.然后通过文件句柄就可以进行各种各样的操作了.根据打开⽅方式的不同能够执行的操作也会 ...

  2. 008PHP文件处理——文件操作r w (用的比较多) a x(用的比较少) 模式 rewind 指针归位:

    <?php /** *文件操作r w (用的比较多) a x(用的比较少) 模式 rewind 指针归位: */ /*$a=fopen('a.txt','r'); echo fread($a,f ...

  3. python 文件操作 r w a

    python基础-文件操作   一.文件操作 对文件操作的流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件       打开文件时,需要指定文件路径和以何等方式打开文件, ...

  4. 文件操作 - 三元运算/chardet/文件操作r w/文件的操作方法

    Alex:读书可以改变一个人的气质读书:豆瓣: 1年读20本 你的问题:想法太多,读书太少 书:追风筝的人,白鹿原  电影:阿甘正传 辛德勒名单---------------------------- ...

  5. python文件操作r+,w+,a+,rb+,

    w:以写方式打开, a:以追加模式打开 (从 EOF 开始, 必要时创建新文件) r+:以读写模式打开 w+:以读写模式打开 (参见 w ) a+:以读写模式打开 (参见 a ) rb:以二进制读模式 ...

  6. matlab文件操作及读txt文件(fopen,fseek,fread,fclose)

    文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MATLAB提供了一系列低层输入输出函数,专门用于文件操作. 1.文件的打开与关闭 1)打开文件 在读写文件之前,必须先用f ...

  7. MATLAB文件操作及读txt文件

    转自:http://blog.csdn.net/vblittleboy/article/details/8049748 文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件.MA ...

  8. 重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作

    原文:重新想象 Windows 8 Store Apps (24) - 文件系统: Application Data 中的文件操作, Package 中的文件操作, 可移动存储中的文件操作 [源码下载 ...

  9. python文件操作-r、w、a、r+、w+、a+和b模式

    对文件操作的基本步骤 f=open('a.txt','r',encoding='utf-8') data=f.read() print(data) f.close() 文件的打开和关闭使用open() ...

随机推荐

  1. Android开发之常用框架WebView详解代码。超详细,送给初学者,完全掌握此控件

    这是我特意为新手小白写的一个代码,教大家完完全全掌握WebView, 我感觉,你看懂这个,基本上可以满足以后工作中的需要了,(只针对Webview的使用),但是其实它还有好多功能,比如真正的设计到和H ...

  2. oeasy教您玩转linux010108到底哪个which

    到底哪个which 回忆上次内容 我们上次讲了查找命令位置whereis 我想找到whereis的位置怎么办?

  3. dump 内存分析

    CPU 及内存占用过大,这也是我们日常调试工作中最常见的两个问题 首先附上两链接 一个样例演示 http://www.cnblogs.com/xioxu/archive/2009/09/04/1560 ...

  4. mysql创建事务,分批次刷新大数据

    对于需要刷新的大数据量,当一次刷新数据量过大时,事务太大,会导致binLog文件太大,在不同的数据库同步时,可能遇到问题,先整理如下,分批次刷新数据 DELIMITER // # 设置//为结束符,否 ...

  5. LightOJ - 1214-Large Division(c++取模 + java的两种写法)

    Given two integers, a and b, you should check whether a is divisible by b or not. We know that an in ...

  6. 调手表(bfs)

    题目描述 小明买了块高端大气上档次的电子手表,他正准备调时间呢.在 M78 星云,时间的计量单位和地球上不同,M78 星云的一个小时有 n 分钟.大家都知道,手表只有一个按钮可以把当前的数加一.在调分 ...

  7. 2020年1月31日 安装Python的BeautifulSoap库记录

    C:\Users\ufo>pip install beautifulsoup4 Collecting beautifulsoup4 WARNING: Retrying (Retry(total= ...

  8. 2020BJDCTF

    diff: 不得不说这种题目挺有意思的,现在记录一下阶梯过程: 先登录远程,发现有两个文件: 虽然直接能卡到flag文件,但是我们是以ctf用户登录的,并不能直接打开flag文件.仔细观察diff文件 ...

  9. npm 报错 cb.apply is not a function

    解决方法1 目录C:\Users(your username)\AppData\Roaming 有个npm文件夹 删除如果没有 npm cache文件cmd下运行 npm clean cache —f ...

  10. taro-script 0.4 发布,基于Taro v3的js解释器组件

    taro-script Github地址 基于Taro v3开发,支持多端小程序动态加载远程 JavaScript 脚本并执行,支持 ES5 语法 最近更新内容 新增useScriptContext获 ...