当前位置:   article > 正文

python对文件操作 r w a 文件复制/修改_r 复制其他文件夹下的文件追加内容

r 复制其他文件夹下的文件追加内容

目录

文件操作简介:

相对路径 绝对路径:

1、只读操作模式(r rb):

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

2、追加(a,ab)

3、只写 字节 wb

4、 文本文件的复制:

5、r+,w+,a+的具体应用

例如:较为常见的 r+

# w+ (几乎用不到)  (先清空再写入)

# a+ (很少使用)   追加写读

# truncate() 截取截断文件(慎用)(特别服务器内)


使用Python 时,经常会遇到对文件的操作,下面来介绍 Python 对文本的操作


文件操作简介:

        使用 Python 来读写文件是非常简单的操作,我们使用 open()函数来打开一个文件,获取到文件句柄,然后通过文件句柄就可以进行各种各样的操作了。

        根据打开方式的不同,能够执行的操作也会有相应的差异,打开文件的方式有:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b

默认使用的,也是最常用的是 r(只读)模式。其他模式需根据项目情况具体选择


相对路径 绝对路径:

绝对路径:从磁盘根目录开始寻找到文件目录 如:E:\Python_workspace\test.txt
相对路径:从文件保存路径寻找,若在同一层文件夹中,则相对路径就是文件名,

若是上一层.则加上 ../  以此类推


1、只读操作模式(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个字符,若再次读取时会在 当前位置继续 去读而不是从头去读取
  10. s = f.readline() # 读取一行数据
  11. print(s.strip()) # stirp() 去掉空白 空格 \t \n

 


    

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

**非文本文件:例如,图片,视频等

  1. 1 # rb 常用于非文本文件 在rb模式下.不能选择encoding字符集.
  2. 2 f = open("../问题1.jpg",mode="rb")
  3. 3 content = f.read()
  4. 4 print(content) # 返回字节 b'\xff\xd8\xff\xe0\x00\x10JFIF\x00......'
  5. 5 f.close()
  6. 6 # read() 将文件内容全部读取出来 ,缺点:占内存,若文件过大容易导致崩溃

 

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

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

  

如果文件路径中含有:n、t 这样的名称,写路径时 写成 \n  \t   ,但是 \n  \t 转义字符,有固定含义。 可以在路径钱加上 r 取消转义功能

  1. 1 f = open(r"E:\Python_workspace\t\n\666.txt",mode="r",encoding="utf-8")
  2. 2 print(f.read())
  3. 3 f.close()

  1. 1 # read() readlines()都不推荐使用甚至是不使用,特别是在生产环境里!!主要是因为,一次性读取,占用内存较大
  2. 2 # 若需要读取 可通过 readline() 一次读取一行 以及循环读取
  3. 3 # 循环读取
  4. 4 # # 文件句柄是一个可迭代对象(必须掌握)
  5. 5 f = open("../王尼玛.txt",mode="r",encoding="utf-8")
  6. 6 for line in f: # 当成list读取文件内容 一行一行的读取 每次读的内容都交给前面的变量
  7. 7 print(line.strip()) # 去掉空格,制表符等
  8. 8 f.close()

2、追加(a,ab)

追加:在文件的最后,添加内容

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

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

  1.   rb wb ab 把字符换成字节 仅此而已
  2.   b - bytes 读取和写入的是字节,用来操作非文本文件(图片, 音频, 视频)

3、只写 字节 wb

  1.  ​
  2. 文件操作: w
  3.   只写 w
  4.   注意.写入时,若没文件.则会创建文件,如果文件存在.则将删除(首次)原内容,再写入新内容

  1. 1 # wb模式下。可不指定文件的编码.但在写文件时必须将字符串转化成utf-8的bytes数据
  2. 2 f = open("小屁孩.txt",mode="wb")
  3. 3 f.write("wusir".encode("utf-8")) # 写入时必须转化成bytes数据
  4. ”“”flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。
  5. 一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。“”“
  6. 4 f.flush()
  7. 5 f.close()

4、 文本文件的复制:

将TXT文本 A 复制成一个新的文件 B

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

将图片(视频)等文件A,复制出一个新的文件 B

非文本形式的文件复制,读取和写入应该使用字节。即:读取--rb。写入--wb

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

5、r+,w+,a+的具体应用

***        r+ 读写  w+ 写读  a+ 追加写读 :

 r+b 读写转换成字节  w+b 写读转换成字节  a+b 追加写读换成字节
+ 扩展

例如:较为常见的 r+

  1. 1 # 正确的操作 先读后写
  2. 2 f = open("person",mode="r+",encoding="utf-8")
  3. 3 content = f.read() # 读取文件
  4. 4 f.write("仓又加错-贾话") # 在最后追加内容
  5. 5 print(content) # 输出读取的文件
  6. 6 f.close()
  7. 7 # 正常的读取之后,写在结尾
  1. 1 # 错误的操作
  2. 2 f = open("person",mode="r+",encoding="utf-8")
  3. 3 f.write("赵敏") # 默认直接写入的话,在开头写入,会覆盖开头的内容
  4. 4 content = f.read()
  5. 5 print(content)
  1. 1 # 坑 不论读取多少内容,再次写入时都是在末尾
  2. 2 f = open("person",mode="r+",encoding="utf-8")
  3. 3 content1 = f.read(3) # 读取前三行内容
  4. 4 f.write("贾话") # 在读取后边,增加内容
  5. 5 print(content1)
  6. 6 f.close()

 #  深坑请注意:在 r+ 模式下.如果读取内容.不论读取内容多少.显示的是多少.再写入或者操作文件时候都是在结尾进行的操作.

# w+ (几乎用不到)  (先清空再写入)

  1. 1 # w+ (几乎用不到) (先清空再写入)
  2. 2 f = open("person",mode="w+",encoding="utf-8")
  3. 3 f.write("你好,世界") # 打开就写入会直接清空内容
  4. 4 content = f.read() # 写入内容后 光标在末尾 读取不了内容
  5. 5 print(content)
  6. 6 f.close()

# a+ (很少使用)   追加写读

  1. 1 # a+ (很少使用) 追加写读
  2. 2 # 不论光标在何处 写入的时候都是在末尾
  3. 3 f = open("person",mode="a+",encoding="utf-8")
  4. 4 f.write("东方不败") # 默认写在末尾
  5. 5 content = f.read()
  6. 6 print(content)
  7. 7 f.close()
  1. 光标 seek(参数1,参数2):

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

# 光标移动到n位置,注意移动的单位是byte,所以如果是utf-8中文部分则为3的倍数。
# 移动到开头:seek(0)
# 移动到结尾:seek(0,2)

  1. 1 f = open("person",mode="r",encoding="utf-8")
  2. 2 f.seek(0) # 以字节为单位
  3. 3 f.seek(2)
  4. 4 print(f.read(2)) # 读取两个字符
  1. 1 # tell() 返回当前光标的位置
  2. 2 info = f.read(3) # utf-8 3*3 9个字节
  3. 3 print(info)
  4. 4 print(f.tell()) # 获取光标的位置

# truncate() 截取截断文件(慎用)(特别服务器内)

  1. 1 f = open("person",mode="w",encoding="utf-8")
  2. 2 f.seek(3) # 光标移动到3
  3. 3 print(f.tell())
  4. 4 # f.truncate() # 后面所有内容都删掉
  5. 5 f.truncate(3) # 从头到3截取
  6. 6 f.close()

# 文件修改:

  固定模块 import.os

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

# 文件操作应用练习:

  1. # 把数据归类 增添数据时自动按格式排列
  2. '''
  3. 1,榴莲,500,60000
  4. 2,苹果,700,70000
  5. 3,荔枝,600,60000
  6. 4,西瓜,800,70000
  7. '''
  1. 1 # 1.
  2. 2 f = open(r"水果.txt",mode="r",encoding="utf-8")
  3. 3 lis = []
  4. 4 for line in f:
  5. 5 lis.append(line)
  6. 6 print(lis) # 没有清晰的分类 仅把每排关联数据作为一个元素装到了lis
  7. 7 # ['1,榴莲,500,60000\n', '2,苹果,700,70000\n', '1,榴莲,500,60000\n', '2,苹果,700,70000']

  1. 1 # 2.
  2. 2 lis = []
  3. 3 # dic = {} # 循环 不可放在这里
  4. 4 f = open(r"水果.txt",mode="r",encoding="utf-8")
  5. 5 for line in f: # "1,苹果,500,60000"——》弄成字典效果——》{id:1,name:苹果, num:500, price:60000}
  6. 6 dic = {} # dic定义字典变量不可放在循环之前 否则只会有一个元素重复添加到lis
  7. 7 li = line.strip().split(",")
  8. 8 dic["id"] = li[0]
  9. 9 dic["name"] = li[1]
  10. 10 dic["num"] = int(li[2])
  11. 11 dic["price"] = int(li[3])
  12. 12 lis.append(dic)
  13. 13 print(lis)
  14. 14 f.close()

  1. 1 # 3.若改动开头 第一行 id,name,price,num 以及在里面增添数据怎么写?
  2. 2
  3. 3 f = open(r"水果.txt",mode="r",encoding="utf-8")
  4. 4 title = f.readline().strip() # 读取第一行 id,name,price,num
  5. 5 lis = title.split(",") # 字符串分割成列表 ['id', 'name', 'price', 'num']
  6. 6 lis1 = []
  7. 7 for line in f:
  8. 8 dic = {}
  9. 9 li = line.strip().split(",")
  10. 10 for i in range(len(lis)):
  11. 11 dic[lis[i]] = li[i]
  12. 12 lis1.append(dic)
  13. 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. 14 f.close()
  15. 15
  16. 16
  17. 17 '''
  18. 18 添加修改数据:
  19. 19 序号,名字,价格,数量,仓库
  20. 20 1,榴莲,500,60000,仓库01
  21. 21 2,苹果,700,70000,仓库02
  22. 22 3,荔枝,600,60000,仓库02
  23. 23 4,西瓜,800,70000,仓库03
  24. 24 '''
  25. 25 # 再次打印:
  26. 26 # [{'序号': '1', '名字': '榴莲', '价格': '500', '数量': '60000', '仓库': '仓库01'}, {'序号': '2', '名字': '苹果', '价格': '700', '数量': '70000', '仓库': '仓库02'}, {'序号': '3', '名字': '荔枝', '价格': '600', '数量': '60000', '仓库': '仓库02'}, {'序号': '4', '名字': '西瓜', '价格': '800', '数量': '70000', '仓库': '仓库03'}]
 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/42396
推荐阅读
相关标签
  

闽ICP备14008679号