欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

文件操作

程序员文章站 2022-03-21 19:45:43
一、基本用法 open:表示打开一个文件 f:变量,操控文件操作.txt文件的句柄。为一个可迭代对象 1)写入模式(w) 如果文件名不存在,则创建文件,然后再写入 如果文件名已存在,则先清空文件内容,然后再写入 2)只读模式(r) read() 1.read():一次性全都读取出来。弊端:占内存。如 ......

一、基本用法

f = open("文件操作.txt", mode='r', encoding="utf-8")
  • open:表示打开一个文件
  • f:变量,操控文件操作.txt文件的句柄。为一个可迭代对象

1)写入模式(w)

  • 如果文件名不存在,则创建文件,然后再写入
  • 如果文件名已存在,则先清空文件内容,然后再写入
f = open("送别.txt" mode="w", encoding="utf-8")
f.write("下马饮君酒, 问君何所之?\n")
f.write("君言不得意, 归卧南山陲。\n")
f.write("但去莫复问, 白云无尽时。\n")
f.close()

 

2)只读模式(r)

  • read()

1.read():一次性全都读取出来。弊端:占内存。如果文件过大,容易导致内存崩溃。

f = open("送别.txt", mode="r", encoding="utf-8")
content = f.read()
print(content)
f.close() 结果: 下马饮君酒, 问君何所之? 君言不得意, 归卧南山陲。 但去莫复问, 白云无尽时。

2.read(n):读取n个字符。需要注意的是,如果再次读取,那么会在当前位置继续去读,而不是从头读。

f = open("送别.txt", mode="r", encoding="utf-8")
content = f.read(5)
print(content)
f.close() 结果: 下马饮君酒

 

  • readline():一次读取一行数据。但每次读取出来的数据末尾都会有一个\n。
f = open("送别.txt", mode="r", encoding="utf-8")
content = f.readline()
print(content)
f.close() 结果: 下马饮君酒, 问君何所之?

 

  • readlines():一次性全都读取出来,返回的是列表,如果文件过大,容易出现内存崩溃的问题。
f = open("送别.txt", mode="r", encoding="utf-8")
content = f.readlines()
print(content)
f.close() 结果: ['下马饮君酒, 问君何所之?\n', '君言不得意, 归卧南山陲。\n', '但去莫复问, 白云无尽时。']
  • 循环读取

f = open("送别.txt", mode="r", encoding="utf-8")
for line in f:
    print(line.strip())
f.close()

结果:
下马饮君酒, 问君何所之?
君言不得意, 归卧南山陲。
但去莫复问, 白云无尽时。

 

3)追加模式(a)

  • 在追加模式下,我们写入的内容会追加在文件的结尾
f = open("送别.txt", mode="a", encoding="utf-8")
f.write("- 王维")
f.close() 结果: 下马饮君酒, 问君何所之? 君言不得意, 归卧南山陲。 但去莫复问, 白云无尽时。 - 王维

 

二、路径

  • 如果文件夹命名为n或t时,此时\n,\t会被识别为转义字符,防止转义,可以路径前加"r"禁止转义。

1)绝对路径

从磁盘根目录找文件

  • windows:e:\python\送别.txt
  • linux:\user\bin\xxx

2)相对路径(用的多)

指相对于当前程序所在的文件夹

  • 例如文件在上一层文件下的送别.txt:../送别.txt

三、读写字节(rb,wb,ab)

  • b:bytes,读取和写入的是字节
  • 应用:用来操作非文本文件(图片, 音频, 视频)
  • 在这些模式下,不能选择encoding字符集

1)rb

f = open("送别.txt", mode="rb")
content = f.read()
print(content)
f.close() 结果: b'\xe4\xb8\x8b\xe9\xa9\xac\xe9\xa5\xae\xe5\x90\x9b\xe9\x85\x92\xef\xbc\x8c \xe9\x97\xae\xe5\x90\x9b\xe4\xbd\x95\xe6\x89\x80\xe4\xb9\x8b\xef\xbc\x9f\r\n\xe5\x90\x9b\xe8\xa8\x80\xe4\xb8\x8d\xe5\xbe\x97\xe6\x84\x8f\xef\xbc\x8c \xe5\xbd\x92\xe5\x8d\xa7\xe5\x8d\x97\xe5\xb1\xb1\xe9\x99\xb2\xe3\x80\x82\r\n\xe4\xbd\x86\xe5\x8e\xbb\xe8\x8e\xab\xe5\xa4\x8d\xe9\x97\xae\xef\xbc\x8c \xe7\x99\xbd\xe4\xba\x91\xe6\x97\xa0\xe5\xb0\xbd\xe6\x97\xb6\xe3\x80\x82'

 

2)wb

    wb模式下,可以不指定打开文件的编码。但是在写文件的时候必须将字符串转化成utf-8的bytes数据,否则报错:typeerror: a bytes-like object is required, not 'str'

f = open("送别.txt", mode="wb")
f.write("   五言古诗".encode("utf-8"))
f.close() 结果: 五言古诗

3)应用

将图片(长城.jpg)从c盘复制到d盘:

f1 = open(r"c:\长城.jpg", mode="rb")
f2 = open(r"d:\长城.jpg", mode="wb")

for line in f1:
    f2.read(line)

f1.close()
f2.close()

 

四、扩展(+)

1)r+(读写)

  • 先读后写(正常)
# place.txt:
# 北京
# 上海
# 深圳


f = open("place.txt", mode="r+", encoding="utf-8")
content = f.read()
f.write("广州")
print(content)
f.close() 结果: 北京 上海 深圳 # place.txt: # 北京 # 上海 # 深圳 # 广州

 

注意:在r+模式下,不论读取多少内容,再次写入时,都是在末尾写入

送别.txt:
下马饮 君酒,问君何所之?



f = open("送别.txt", mode="r+", encoding="utf-8")
content = f.read(3)
f.write("\n君言不得意,归卧南山陲。")
print(content)
f.close()

结果:
下马饮

送别.txt:
下马饮君酒,问君何所之?
君言不得意,归卧南山陲。

 

  • 先写后读(错误示范)

如果直接写入的话,则在开头写入,覆盖开头的内容

place.txt:
北京
上海
深圳




f = open("place.txt", mode="r+", encoding="utf-8")
f.write("广州")
content = f.read()
print(content)

f.close()

结果:

上海
深圳

place.txt:
广州
上海
深圳

 

2)w+(写读)

  • 写入东西后,光标在末尾,再次读取时,读取内容为空白
f = open("introduction.txt", mode="w+", encoding="utf-8")
f.write("你好,我叫赛利亚")
content = f.read()
print(content)

f.close()


结果:

 

3)r+(追加写读)

  • 不论光标在何处,写入时,都是在末尾写入
f = open("introduction.txt", mode="a+", encoding="utf-8")
f.write("祝你玩的愉快!")
content = f.read()
print(content)

f.close()


结果:



introduction.txt:
你好,我叫赛利亚祝你玩的愉快!

 

五、光标

1)seek(参数1, 参数2)

  • 参数1:偏移量,表示移动多少个单位。
  • 参数2:表示从什么位置进行偏移。0表示开头,1表示当前位置,2表示末尾。把光标移动至文件的开头:seek(0);移至末尾:seek(0, 2)
  • 功能:移动光标
  • 特点:以字节为单位
introduction.txt:
你好,我叫赛利亚


f = open("introduction.txt", mode="r", encoding="utf-8")
f.seek(3)
content = f.read(3)
print(content)
f.close() 结果: 好,我

 

2)tell()

程序返回当前光标的位置

introduction.txt:
你好,我叫赛利亚


f = open("introduction.txt", mode="r", encoding="utf-8")
content = f.read(3)
print(f.tell())  # 9
f.close()

 

3)truncate()

默认从开头截取到光标位置,后面的内容将会被删除。

introduction.txt:
你好,我叫赛利亚


f = open("introduction.txt", mode="r+", encoding="utf-8")
f.seek(3)
f.truncate()
f.close()


introduction.txt:
你

 

truncate(n):从开头载取到n位置,后面的内容将会被删除。

introduction.txt:
你好,我叫赛利亚


f = open("introduction.txt", mode="r+", encoding="utf-8")
f.truncate(3)
f.close()


introduction.txt:
你

 

六、文件修改

    文件操作并有直接修改文件功能,只能将文件中的内容读取到内存中,将信息修改完毕,然后将源文件删除,将新的文件的名字改成老文件的名字。

import 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("?", "。")
        f2.write(line)

os.remove("唐诗")  # 删除源文件
os.rename("唐诗_副本", "唐诗")  # 把副本改名为源文件

 

七、文件操作应用

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:
    f2.write(line)

f1.close()
f2.close()

2)数据统计

data.txt:
序号,名称,价格,库存
1,苹果,5,6000
2,榴莲,20,5000
3,香蕉,3,2000


with open("data.txt", mode="r", encoding="utf-8") as f:
    titles = f.readline().strip()
    t_list = titles.split(",")

    lst = []
    for line in f:
        dic = {}
        line = line.strip().split(",")
        for i in range(len(line)):
            dic[t_list[i]] = line[i]
        lst.append(dic)
print(lst)


结果:
[{'序号': '1', '名称': '苹果', '价格': '5', '库存': '6000'}, {'序号': '2', '名称': '榴莲', '价格': '20', '库存': '5000'}, {'序号': '3', '名称': '香蕉', '价格': '3', '库存': '2000'}]