[TOC]
引用:
https://developer.aliyun.com/learning/course/601/detail/8766
Python打开文件
内容简介
一、文件
二、Open 返回值
三、总结
一、文件(file)
在我们的计算机里一切皆是文件,比如说 “01.异常.py” 这是一个文本文件,电脑桌面上的所有图标快捷方式也是文件,随便一个软件打开文件所在位置会发现里面是各种各样的文件,包括看的电影、图片,听的音乐,所有在计算机里存的东西都是文件。我们可以手动的对这些文件进行操作,同样在 python 中也可以通过程序对文件进行操作。
所以,这里所说的文件是指:
1、通过 python 程序对计算机中的各种文件进行增删改查的操作。
2、文件还有另一个名字叫做 i/o(input/output)input 是输入,output 是输出。注意这都是对我们人来讲的,input 是指人通过程序从计算机中读取信息向人输入,同样,output 是指从人这里把一些信息输出到文件里。
3、操作文件的步骤:
①打开文件
②对文件进行各种操作(读、写),然后保存
③关闭文件
这是手工去操作一个文件的步骤。同样在 python 里对文件进行操作也需要经历这三个步骤。
通过 python 创建一个文件名叫 demo.txt 的文件,文件里写入一些文本内容。(【Sublime Text编辑器】中输入 lorem 然后按下 tab 键回车会自动生成内容。这个英文文本没有任何意义,只是一个测试排版的文本。)
现在想要打开 demo.txt 的文件,需要使用 python 的内接函数,找到Python官方文档中的Library Reference,打开 Built-in Functions,找到 open(),找到函数
https://docs.python.org/3/library/functions.html#open
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
复制粘贴进 python。这就是一个打开文件的函数。
例:
file_name='demo.txt'
open(file_name)
这里创建一个变量,来保存文件的名字(路径):file_name='demo.txt'
这时候直接用open(file_name)
作为第一个参数传进去,这就是打开file_name对应的文件。如何验证文件是不是打开呢?只要不报错就是打开了。改一个file_name='demo123.txt'
执行会发现报错了。
二、open 返回值
返回一个对象,这个对象代表了当前打开的文件。比如file_obj = open(file_name)
# 打开 file_name 对应的文件。 直接print(file_obj)
保存打印会出现。
file_obj= open(file_name)
print(file_obj)
# 结果:<_io.TextIOWrapper name='demo.txt' mode='r' encoding='cp936'>
表明这个对象确实存在,已经打开了。如果目标文件和当前文件在同一级目录下,则直接使用文件名即可。如果不在同一级目录下,这个时候就必须使用完整的路径(相对路径 或 绝对路径):
比如创建一个文件夹名叫 hello ,把 demo.txt 文件移到 hello 里,执行file_name='hello/demo.txt'
才能够找到并打开文件。
在 windows 里表示一个路径的时候应该用的是\,但是在这里使用\的话会出现问题,因为 在 python 里 \ 代表的是转义字符。所以在 windows 系统使用路径时,可以使用 / 代替\。或者可以使用 \ 代替 \,或者也可以使用原始字符串。原始字符串就是在字符串前加r比如:
file_name=r'hello\demo.txt
这时候里边的转义字符就会被忽略。
现在把 hello 文件夹在往上移一级,file_name=r'hello\demo.txt'
这个字符串就没有效果了,所以表示上一级路径,可以使用..来返回上一级目录。
代码:file_name='../hello/demo.txt'
。这里..就表示需要从当前目录出来到上一级目录,出来后再去 hello 里边找demo.txt。
如果目标文件距离当前文件比较远,此时可以使用绝对路径。
绝对路径应该从磁盘的根目录开始书写,比如桌面上的快捷方式就需要打开文件所在位置全部复制路径:
file_name='D:\QQ\Bin\QQScLauncher.exe'
注意这里\需要改成/或者使用原始字符串加上 r。
这就是一个绝对根路径,保存执行也可以找到目标文件。
三、总结
如果文件在当前目录下直接写文件名,如果不在当前目录下要写路径,如果不在则路径里面用..返回,如果绝对路径比较远,需要使用文件的绝对路径。
关闭文件
目录:
一.对文件进行各种操作。
二.关闭文件。
- 对文件进行各种操作
# 要打开的文件
file_name = 'demo.txt'
# 调用open()打开文件
file_obj = open(file_name)
#当我们获取了文件对象以后,所有的对文件的操作都应该通过对象来进行
#读取文件中的内容
# read()方法,用来读取文件中的内容,它会将内容全部保存为一个字符串返回
# 本示例 read 只能读取英文内容。
content = file_obj.read()
print(content)
- 关闭文件。
# 方法一: 调用 close()方法关闭文件
file_obj.close()
# 方法二: with...as语句
file_name = 'demo.txt'
try:
with open(file_name) as file_obj:
#在 with 语句中可以直接使用 file_obj 来做文件操作
#此时这个文件只能在 with 中使用,一旦 with 结束则文件会自动 close()
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name} 文件不存在~~')
文件的读取
调用open()来打开一个文件,可以将文件分成两种类型
- 纯文本文件(使用utf-8等编码编写的文本文件)
- 二进制文件(图片、mp3、ppt等)
open()打开文件时,默认是以文本文件的形式打开的,默认编码为None
- 处理文本文件时,必须指定文件的编码
读取大文件
内容简介:
一、read 函数应用
二、读取大文件的方式
一、Read() 函数应用
如果直接调用 read() ,它会将文本文件的所有内容全部都读取出来
如果要读取的文件较大的话,会一次性将文件的内容加载到内存中,容易导致内存泄漏所以对于较大的文件,不要直接调用 read()
help(file_obj.read)
- read 可以接收一个size作为参数,该参数用来指定要读取的字符的数量。 默认值为-1, 它会读取文件中的所有字符
- 可以为size指定一个值,这样read()会读取指定数量的字符,
- 每一次读取都是从上次读取到位置开始读取的
- 如果文件中字符的数量小于size,则会读取剩余所有的字符
- 如果已经读取到了文件的最后了,则会返回''空串
# demo2.txt 内容是中文
file_name = 'demo2.txt'
try:
with open(file_name, encoding='utf-8') as file_obj:
content = file_obj.read(6)
print(content)
print(len(content))
except FileNotFoundError:
print(f'{file_name} 文件不存在~~')
file_name = 'demo2.txt'
try:
with open(file_name, encoding='utf-8') as file_obj:
# 定义一个变量,来保存文件的内容
file_content = ''
# 定义一个变量,来指定每次读取的大小
chunk = 100
# 创建一个循环来读取文件内容
while True:
# 读取chunk大小的内容
content = file_obj.read(chunk)
# 检查是否读取到了内容
if not content:
# 内容读取完毕,退出循环
break
# # 输出内容
# print(content,end='')
file_content += content
except FileNotFoundError:
print(f'{file_name} 文件不存在~~')
print(file_content)
readline()
该方法可以用来读取一行内容
print(file_obj.readline())
readlines()
该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表中返回
import pprint
file_name = 'demo2.txt'
try:
with open(file_name, encoding='utf-8') as file_obj:
r = file_obj.readlines()
pprint.pprint(r)
pprint.pprint(r[0])
pprint.pprint(r[1])
except FileNotFoundError:
print(f'{file_name} 文件不存在~~')
for循环读取行
file_name = 'demo2.txt'
try:
with open(file_name, encoding='utf-8') as file_obj:
for t in file_obj:
print(t)
except FileNotFoundError:
print(f'{file_name} 文件不存在~~')
文件写入
write()来向文件中写入内容
- 如果操作的是一个文本文件的话,则 write( ) 需要传递一个字符串作为参数。即使要写入数字,也需要是字符串类型。
- 该方法可以分多次向文件中写入内容
- 写入完成以后,该方法会返回写入的字符的个数
- 使用 open() 打开文件时指定打开文件所要做的操作类型(读、写、追加)
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数 | 意义 |
---|---|
r | 只读。默认此mode。 如果文件不存在则报错 |
w | 覆盖写。如果文件不存在会创建文件,如果文件存在则会截断文件。截断文件指删除原来文件中的所有内容 |
a | 表示追加内容 |
x | 用来新建文件, 不覆盖已存在的文件,如果文件存在则报错 |
+ | 为操作符增加功能 (读和写) |
r+ | 即可读又可写,文件不存在会报错 |
二进制文件
内容介绍:
一、引入
二、读取模式
三、写出读取内容
一、引入
现在要读取桌面上一个文件:
输入:
file_name = 'c:/Users/lilichao/Desktop/告白气球.flac'
with open(file_name , 'r') as file_obj:
print(file_obj.read())
结果如下:会报错,无法读
UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 505: illegal multibyte sequence
注意:
要读的 flac 是一个音乐文件,默认读取文件时,是当作文本文件读,而不是文本文件的文件统称为二进制文件
二、读取模式
- t 读取文本文件(默认值)
with open(file_name , 'r ') as file_obj # 只写 r 和 rt 是一样的
with open(file_name , 'rt') as file_obj
读取文本文件时, size 是以字符为单位的
- b 读取二进制文件
with open(file_name , 'rb ') as file_obj
读取二进制文件时,size 是以字节为单位
文件过大,不宜一次性读取,需要分段读
输入:
print(file_obj.read(100) )
三、写出读取内容
file_name = 'c:/Users/lilichao/Desktop/告白气球.flac'
with open(file_name , 'r') as file_obj:
# 定义一个新的文件
new_name = 'aa.flac'
with open(new_name , 'wb') as new_obj:
# 定义每次读取的大小
chunk = 1024*100
while True: #从已有的对象中读取数据
content = file_obj.read(chunk)
#内容读取完毕,终止循环
if not content :
break
#将读取到的数据写入到新对象中
new_obj.write(content)
执行看到多出一个文件
点开后可以播放。
读取位置 seek() 和 tell()
内容介绍:
一、二进制读文件
二、tell( )
三、seek( )
一、二进制读文件
demo.txt 中继续写为 Lorem 的内容,之前以文本形式读取,现在想要以二进制形式去读取
输入
with open('demo.txt' , 'rb') as file_obj:
print(file_obj.read( ) )
形式与之前文本去读的内容大致无区别,但是前面多了 b ,这表示现在的字符串是一个二进制字符串
输入:
print(file_obj.read( 100 ) )
读取 100 个字符,但读的是二进制,所以实际上是 100 个字节,但是像英文,一个字符就是一个字节,所以似乎没有什么区别
二、tell()
tell() 方法用来查看当前读取的位置
print('当前读取到了-->' , file_obj.tell( ) )
print(file_obj.read( 100 ) )
print(file_obj.read( 30 ) ) # 当前就是读取到130
三、seek()
- seek() 可以修改当前读取的位置
seek() 需要两个参数
- 第一个 是要切换到的位置
第二个 计算位置的方式
可选值:
- 0 从头计算,默认值
- 1 从当前位置开始计算
- 2 从最后位置开始计算
file_obj.seek(55)
文件内容包含中文时,用seek()时需要考虑汉字所占字节数,不然会报错 UnicodeDecodeError
文件的其他操作
https://docs.python.org/3/library/os.html
https://docs.python.org/zh-cn/3/library/os.html
内容介绍:
一、os.listdir( )
二、os.getcwd( )
三、os.chdir( )
四、os.mkdir( )
五、os.rmdir( )
六、os.remove( )
七、os.rename( '旧名字' , '新名字' )
一、os.listdir( )
获取指定目录的目录结构,需要一个路径作为参数,会获取到该路径下的目录结构,默认路径为 . 当前目录,该方法会返回一个列表,目录中的每一个文件(夹)的名字都是列表中的一个元素
import os
from pprint import pprint
r = os.listdir()
pprint(r)
二、os.getcwd( )
获取当前所在的目录
输入:
r = os.getcwd( )
pprint(r)
三、os.chdir( )
切换当前所在的目录,作用相当于 cd
输入:
os.chdir( ' .. ' )
r = os.getcwd( )
pprint(r)
# 再比如输入:
os.chdir( 'c:/' )
四、os.mkdir( )
创建目录 在当前目录下创建一个名字为 aaa 的目录
输入:
os.mkdir("aaa")
五、os.rmdir( )
删除目录
输入:
os.rmdir('aaa')
六、os.remove( )
删除文件
# 先 open( 'aa.txt' , 'w')
os.remove( 'aa.txt' )
七、os.rename( '旧名字' , '新名字' )
os.rename( '旧名字' , '新名字' ),可以对一个文件进行重命名,也可以用来移动一个文件
os.rename( 'aa.txt' , 'bb.txt' )
# 其他写法:
os.rename( 'bb.txt', 'c:/users/lilichao/desktop/bb.txt')
# 文件路径到了桌面