day14- 文件

Python提供了内置的文件对象,以及对文件、目录进行操作的内置模块
文件有两个属性,文件名和路径

1、文件路径

文件路径大家都理解,比如我有一个文件log.txt文件放在D盘,"D:\log.txt"这个就是这个文件的文件路径
路径分为绝对路径和相对路径

绝对路径

总是从根目录开始,不依赖当前的工作目录
Window 系统中以盘符(C:、D:)作为根文件夹。例如:C:\Users\YourName\Documents\file.txt
而 OS X 或者 Linux 系统中以 / 作为根文件夹。例如:/home/yourname/documents/file.txt
 

相对路径

相对路径是相对于当前工作目录的路径
project/
│
├── main.py
└── data/
    └── file.txt

 

如果我们读取file.txt文件,我们就可以使用相对路径,data/file.txt就是上述的相对路径
读取文件使用open函数,下边我们详细讲解,这里我们直接使用
file_path = 'data/file.txt'
with open(file_path, 'r') as file:
    lines = file.readlines()
    print(lines)
    
# 执行结果
['abcdefg']

 

 

路径拼接

我们在实际工作中,会经常联合使用,比如文件的工作目录是不固定的,但是文件在项目中是固定的,所以我们确定文件的相对路径,然后拼接文件在项目中的路径,这样不管目录怎么变,我们文件的指向路径永远不会出错
首先我们用到了os模块
  • os.path.join(path1, path2, ...): 拼接路径
  • os.path.dirname(__file__):当前文件的工作目录
还是上述的文件例子:
project/
│
├── main.py
└── data/
    └── file.txt

 

我们使用拼接的方式确定file.txt文件的路径
import os

# 获取当前文件的所在的目录
base_dir = os.path.dirname(__file__)

# 将路径与文件名连接起来
file_path = os.path.join(base_dir, 'data/file.txt')

# 打开文件,并读取所有行
with open(file_path, 'r') as file:
    lines = file.readlines()
    print(lines)
 

2、open文件

open() 函数是Python内置的一个函数

认识open

f = open('文件路径', mode='r')
查看一下源码
  • file: 要打开的文件路径(字符串)或文件对象。
  • mode: 打开文件的模式,如 'r'(读取)、'w'(写入)、'a'(追加)等
模式 可做操作 若文件不存在 是否覆盖
r 只读 error -
r+ 读写 error T
w 只写 create T
w+ 读写 create T
a 只写 create F,尾部追加写
a+ 读写 create F,尾部追加写
wb 只写二进制字符串,写入bytes create T
rb 只读二进制字符串,返回bytes error -

打开操作三板斧

1.打开文件:open函数,返回文件对象
2.对文件进行读写操作,read()函数/write()函数
3.关闭文件:close函数,关闭文件
 

小栗子

打开project项目下的file文件,打印输出读取文件的内容
project/
│
├── main.py
└── data/
    └── file.txt

 

练习:
# 1、打开文件
f = open('data/file.txt', 'r')

# 2、读取文件内容
content = f.read()
print(content)

# 3、关闭文件
f.close()

 

 

3、open另一种写法

上边我们已经学会了open函数的使用以及操作文件的三板斧
但是呢,还是会有问题的,在上边的表格中我们可以看到,如果文件不存在的时候,运行代码会报错
而且当文件读写时都有可能产生 IOError ,一旦出错,后面的 f.close() 就不会调用
 

with open

所以我们使用open函数还有另一种用法
with open()用法
好处:结合了 open() 函数和上下文管理器 with 语句,用于打开文件并在操作完成后自动关闭文件
with open(file_path, mode, encoding) as file:
    # 在文件上进行操作
    # 文件会在代码块退出后自动关闭
 
encoding编码格式小知识:
f = open(...)是由操作系统打开文件,如果打开的是文本文件,会涉及到字符编码问题,如果没有为open指定编码,那么打开文本文件的默认编码很明显是操作系统说了算了,操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8;
f = open('a.txt','r',encoding='utf-8')

小栗子

还是上述那个例子
project/
│
├── main.py
└── data/
    └── file.txt

 

我们使用with...open函数打开读取文件,打印输出文件内容
# 使用with语句打开文件file.txt,以只读模式
with open('data/file.txt', 'r') as f:
    # 将文件内容读取到content变量中
    content = f.read()
    # 打印content变量
    print(content)
    
# 执行结果
abcdefj

 

4、文件操作的模式

这里我们讲三种文件操作模式:
  • r(默认的):只读
  • w:只写
  • a:只追加写

r 模式的使用

# r只读模式: 在文件不存在时则报错
 with open('data/file.txt', 'r') as f:
    content = f.read()
    print(content)

 

读取文件,如果不命名编码格式,默认采用gbk编码格式,这里如果我们要读取的文件格式是utf-8,这时候我们可以open函数指定添加文件的编码格式
# 增加coding编码格式
with open('data/file.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

 

w 模式的使用

# w只写模式: 在文件不存在时会创建空文档,文件存在会清空文件写入新内容
with open('data/file.txt', 'w', encoding='utf-8') as f:
    f.write('你好,世界!\n')
    f.write('你好,中国!\n')
    f.write('111\n222\n333\n')

 

写入文件我们先把mode模式改成w,然后在下边调用文件对象的write方法写入文件内容,注意的是,如果文件不存在不会报错,会自动创建然后写入文档,如果文件存在有内容,写入内容后文件内容会清空写入新内容
查看写入内容:

a模式的使用

# a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件内容追加写入内容
 with open('data/file.txt', 'a', encoding='utf-8') as f:
    f.write('追加的内容1\n')
    f.write('追加的内容2\n')
    f.write('111\n222\n333\n')

 

查看追加内容:

w 模式与 a 模式的异同

  • 相同:都是往文件写入内容,文件不存在的时候会创建文件
  • 不同:w模式是每次写入都会清空原来的文件内容,把写入的内容写入到文件里,a模式是不会清空原来的文件内容,会在后边追加写入文件内容

5、读写文件

文件读取read()、readline()、readlines()

 
read()
优点:逐个字节或字符读取所有内容
劣势:大文件太大无法读取,不适用于读取大文件
with open('data/file.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

 

 
readline()
优点:逐行读取文件内容
劣势:比readlines()慢很多
with open('data/file.txt', 'r', encoding='utf-8') as f:
    content = f.readline()
    print(content)

 

使用readline只会读取一行数据,而且读取第一行内容时,会读取最后的换行符,所以使用print函数打印的时候默认会换行,多出一个空行
这块我们可以使用数字来控制读取的字节数
with open('data/file.txt', 'r', encoding='utf-8') as f:
    # 读取6个字符数
    content = f.readline(6)
    print(content)

 

 
readlines()
优点:读取所有行文件内容;自动将文件内容分析成一个行的列表
with open('data/file.txt', 'r', encoding='utf-8') as f:
    content = f.readlines()
    print(content)

 

执行结果:
['你好,世界!\n', '你好,中国!\n', '111\n', '222\n', '333\n', '追加的内容1\n', '追加的内容2\n', '111\n', '222\n', '333\n']

 

你会发现:
  • readlines()读取所有行然后把它们作为一个字符串列表返回
  • 返回的每一行内容包含换行符

文件写入write()和writelines()

 
write()
优点:向文件写入单行字符串数据
每次调用write()都会将参数字符串写入文件,不会自动添加换行符
with open('data/file.txt', 'r', encoding='utf-8') as f:
    content = f.read()
    print(content)

 

 
writelines()
优点:向文件写入字符串列表
一次性向文件写入多行字符串数据符
lines = ['Line 1\n', 'Line 2\n', 'Line 3\n']
with open('data/file.txt', 'w', encoding='utf-8') as f:
    f.writelines(lines)

 

day14练习

初级:
1.打开文件操作三步骤是什么
2.文件操作的几种模式
3.读写文件的函数
 
中级:
1.编写一个程序,将指定的文本,"我是追加的文本内容",追加到文件,file.txt,的末尾
2.编写一个程序,统计指定文件的总行数,文件如下:
3.编写一个程序,将一个文件的内容复制到另一个文件中,a文件内容复制到b文件,如a文件内容如下:
高级
1.编写一个程序,统计指定文件中每个单词出现的次数,文件内容如下:
 
 
 
 
 
posted @ 2024-06-07 16:01  似小陈ya  阅读(3)  评论(0编辑  收藏  举报