19.文件

文件编码

编码技术即:翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容

UTF-8 是目前全球通用的编码格式

文件的操作步骤

打开文件

在Python中,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件:

open(name,mode,encoding)

  name: 是要打开的目标文件名的字符串(可以包含文件所在的具体路径)

  mode: 设置打开文件的模式(访问模式):只读、写入、追加等

  encoding: 编码格式(推荐使用UTF-8)

mode 常用的三种基础访问模式:

  • r 以只读方式打开文件,文件的指针将会放在文件的开头,这是默认模式
  • w 打开一个文件只用于写入,如果该文件已经存在则打开文件,并从开头开始编辑,原有内容会被删除,如果文件不存在,创建新文件
  • a 打开一个文件用于追加,文件已存,则新的内容将会被写入到已有内容之后,如果文件不存在,创建新文件进行写入
f = open("./img/python.txt","r",encoding="UTF-8")
print(type(f))
# encoding并不是第三位参数是第四位参数所以需要填写参数encoding进行赋值
# 注意:此时的'f'是'open'函数的文件对象,对象是python中一种特殊的数据类型,拥有属性和方法
# 可以使用对象.属性或者对象.方法对其进行访问

读操作相关方法

  • read()方法: 文件对象.read(num) num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,则读取文件中所有数据
  • readlines()方法: 将整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行数据为一个元素
  • readline()方法: 一次读取一行内容
f = open("./img/python.txt","r",encoding="UTF-8")

print(f.read(10))

print(f.read())   # 连续read读取同一个文件时,会在上一个read读取位置继续读取
Hello Worl
d
I Love Python
Hao Hao Xue Xi
Tian Tian Xiang Shang
f = open("./img/python.txt","r",encoding="UTF-8")
print(f.readlines())
my_list = f.readlines()   # 上述读取已读完内容,指针位于最后,再次读取会为空
print(my_list)
['Hello World\n', 'I Love Python\n', 'Hao Hao Xue Xi\n', 'Tian Tian Xiang Shang']
[]
f = open("./img/python.txt","r",encoding="UTF-8")
print(f.readline())
print(f.readline())
print(f.readline())   # 每执行一次读取指针下一行内容
print(f.readline())
print(f.readline())
Hello World

I Love Python

Hao Hao Xue Xi

Tian Tian Xiang Shang

中文 示例
  • for循环读取文件数据
f = open("./img/python.txt","r",encoding="UTF-8") 
for i in f:
    print(i)
Hello World

I Love Python

Hao Hao Xue Xi

Tian Tian Xiang Shang

中文 示例

关闭文件对象

close() 关闭文件对象

通过close,关闭文件对象,也就是关闭对文件的占用

如果不调用close,同时程序没有停止运行,那么这个文件将一直被Python程序占用

f = open("./img/python.txt","r",encoding="UTF-8") 
print(f.read(11))
f.close()
# print(f.read())   # ValueError: I/O operation on closed file.
Hello World

with open 语法操作文件

通过在with open语句块中对文件进行操作

可以在操作完成后自动关闭掉open的文件,避免遗忘掉cloase方法

with open("./img/python.txt","r",encoding="UTF-8")  as f:
    for i in f:
        print(i)
Hello World

I Love Python

Hao Hao Xue Xi

Tian Tian Xiang Shang

中文 示例

练习-单词统计

with open("./img/word.txt","r") as f:
    #str = f.read()
    print(f.read().count("itheima"))
6
with open("./img/word.txt","r") as f:
    sum = 0
    for line in f:
        print(line.split(" "))
        # for i in line.strip().split(" "):  # 通过line.strip()去除首尾空格和换行符
        for i in line.replace("\n","").split(" "):  # 也可以能冠军line.relace()替换掉换行符
            if i == "itheima":
                sum += 1
    print(sum)
['itheima', 'itcast', 'python\n']
['itheima', 'python', 'itcast\n']
['beijing', 'shanghai', 'itheima\n']
['shenzhen', 'guangzhou', 'itheima\n']
['wuhan', 'hangzhou', 'itheima\n']
['zhengzhou', 'bigdata', 'itheima']
6

文件的写入操作

注意:

  • 直接调用write,内容并未真正写入文件,而是积攒在程序的内存中,称之为缓冲区
  • 当调用flush的时候,内容会真正写入文件
  • 这样做是避免频繁的操作硬盘,导致效率下降
  • w 模式,文件不存在,会创建新文件,文件已存在会清空原有内容,close()方法,带有flush()方法的功能
f = open("./img/write.txt","w")
f.write("hello world")
f.flush()
f.close()  # 不调用flush 使用close也会写入文件

f = open("./img/write.txt","w")
f.write("I Love Python")      # w 模式会清空之前的内容并写入新的内容
f.close()

f = open("./img/write.txt","r")
f.read()
'I Love Python'

文件的追加写入操作

注意:

  • a 模式,文件不存在会创建文件
  • a 模式,文件已存在会在文件最后追加写入文件
f = open("./img/write.txt","a")
f.write(" hello world")
f.close()
f = open("./img/write.txt","a")
f.write("\nhello world")
f.close()
f = open("./img/write.txt","r")
f.readlines()
['I Love Pythonhello worldhello world hello world hello world\n',
 'hello world hello world\n',
 'hello world\n',
 'hello world hello world\n',
 'hello world hello world\n',
 'hello world']
# 把 ./img/word.txt 里含有python的行 追加到 ./img/write.txt文件
fr = open("./img/word.txt","r")
fw = open("./img/write.txt","a")
for line in fr:
    line = line.strip()
    print(line)
    for i in line.split(" "):
        if i == "python":
            fw.write("\n")
            fw.write(line)
        else:
            continue
fr.close()
fw.close()

f = open("./img/write.txt","r")
f.readlines()
itheima itcast python
itheima python itcast
beijing shanghai itheima
shenzhen guangzhou itheima
wuhan hangzhou itheima
zhengzhou bigdata itheima

['I Love Pythonhello worldhello world hello world hello world\n',
 'hello world hello world\n',
 'hello world\n',
 'hello world hello world\n',
 'hello world hello world\n',
 'hello worlditheima itcast python\n',
 'itheima itcast python\n',
 'itheima python itcast\n',
 'itheima itcast python\n',
 'itheima python itcast']