文件操作

文件操作

基本用法

f = open("文件操作.txt", mode='r', encoding="utf-8")
...
f.close()
  • open:表示打开一个文件
  • f:变量,操控文件操作.txt文件的句柄。为一个可迭代对象
  • f.flush():刷新管道,在向文件里写内容时,管道里也会有数据,使用f.flush()可将管道里数据写入到文件里。
  • f.close():关闭文件

写入模式(w)

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

只读模式(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()

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

追加模式(a)

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

路径

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

绝对路径

从磁盘根目录找文件

  • Windows:E:\python\送别.txt
  • Linux:\user\bin\xxx

相对路径(用的多)

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

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

读写字节(rb,wb,ab)

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

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'

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() 结果: 五言古诗

应用

将图片(长城.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()

扩展(+)

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:
广州
上海
深圳

w+(写读)

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

f.close()


结果:

a+(追加写读)

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

f.close()


结果:



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

光标

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() 结果: 好,我

tell()

程序返回当前光标的位置

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


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

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("唐诗_副本", "唐诗")  # 把副本改名为源文件

文件操作应用

文本文件的复制

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

数据统计

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'}]

 

posted @ 2018-10-26 19:54  Ethan_Y  阅读(364)  评论(0编辑  收藏  举报