2.4 文件对象的常用方法
文件对象方法 | 执行操作 |
read([size]) | 从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容 |
readline() | 从文本文件中读取一行内容 |
readlines() | 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回 |
write(str) | 将字符串str内容写入文件 |
wirtelines(s_list) | 将字符串列表s_list写入文本文件,不添加换行符 |
seek(offset[,whence]) | 把文件指针移动到新的位置,offset表示相对于whence的位置;offset为正往结束方向移动,为负往开始方向移动。whence不同的值代表不同含义:0:从文件头开始计算(默认值);1:从当前位置开始计算;2:从文件尾开始计算 |
tell() | 返回文件指针的当前位置 |
truncate([size=file.tell()]) | 截取文件到size个字节,默认是截取到文件指针当前位置 |
flush() | 把缓冲区的内容写入文件,但不关闭文件 |
close() | 关闭文件 |
read():读出
file = open('a.txt', 'r') print(file.read())
readline():读一行
file = open('a.txt', 'r') #print(file.read()) print(file.readline())
readlines():将每一行元素作为独立字符串,放入列表当中
file = open('a.txt', 'r') #print(file.read()) #print(file.readline()) print(file.readlines())
['中国\n', '美丽']
write():写入
file = open('c.txt', 'w') file.write('hello') file.close()
writelines():将字符串列表s_list写入文本文件,不添加换行符
file = open('c.txt', 'a') lst = ['java', 'go', 'python'] file.writelines(lst) file.close()
seek()
file = open('a.txt', 'r') file.seek(2) # 一个中文两个字节,跳过了国字 print(file.read()) print(file.tell()) # 中国,回车,美丽总共10字节 file.close()
国 美丽 10
tell()
file = open('b.txt', 'r') print(file.read()) print(file.tell()) # 中国,回车,美丽总共10字节 file.close()
pythonpython 12
flush()
file = open('d.txt', 'a') file.write('hello') file.flush() # 后面可以继续写内容 file.write('world') file.close() # 后面不可以写代码
encoding=‘utf-8’
f = open('C:\\Users\\zdb\\Desktop\\abc.txt', encoding='utf-8') #encoding='utf-8' 防止乱码加上去的 print(f) print(f.read()) #对的,读,并输出
<_io.TextIOWrapper name='C:\\Users\\zdb\\Desktop\\abc.txt' mode='r' encoding='utf-8'> abcdefg
例2
file_name = input('请输入需要打开的文件名:') f = open(file_name) print('文件的内容是:') for each_line in f: print(each_line)
with open(‘a.txt’, ‘r’) as file::这样就不需要关闭文件那一行代码了
with open('a.txt', 'r') as file: print(file.read())
中国 美丽
例2
with open('win.png', 'rb') as file: # 以二进制读打开 with open('copy.png', 'wb') as target_file: # 以二进制写打开 target_file.write(file.read()) # 目标文件写入原文件被读的
2.5 文件路径:相对路径、绝对路径
相对路径:只能读取到同一目录里面的文件
- 1、text_files与主程序在一个目录
- 2、读取text_file里面的pi_digits.txt
- 3、主程序代码如下
with open('text_files\pi_digits.txt') as file_object: #open接受一个参数:要打开的文件的名称 #关键字with在不需要访问文件后将其关闭 contents = file_object.read() #read读取这个文件的全部内容,并将其作为长串字符存储在变量contents中 print(contents) #打印输出
绝对路径:读取系统任何地方的文件
f = open('C:\\Users\\zdb\\Desktop\\abc.txt', encoding='utf-8') #encoding='utf-8' 防止乱码加上去的 print(f) print(f.read()) #对的,全输出
例2
f = open('C:\\Users\\zdb\\Desktop\\abc.txt', encoding='utf-8') #f.seek(0,0) lines = list(f) for each_line in lines: print(each_line.rstrip()) #rstrip去掉\n
abcdefg 123 456
三. 组织文件
3.1 shutil模块复制、移动、删除、改名文件\文件夹
1. 复制文件:shutil.copy()
例:源文件在桌面,名为a.txt
import shutil, os os.chdir('C:\\Users\\zdb\\Desktop\\') # 设置工作路径 shutil.copy('C:\\Users\\zdb\\Desktop\\a.txt', 'E:\\') # 复制到E盘 shutil.copy('C:\\Users\\zdb\\Desktop\\a.txt', 'E:\\b.txt') # 重新命名为b.txt
2. 复制文件夹:shutil.copytree()
例:源文件在桌面上,a文件夹里面有个a.txt
import shutil, os os.chdir('C:\\Users\\zdb\\Desktop\\') shutil.copytree('C:\\Users\\zdb\\Desktop\\a', 'E:\\b') # 复制到E盘文件夹命名为b
3. 移动文件:shutil.move()
例1:源文件在a下a.txt,E盘有个空文件夹b
import shutil, os os.chdir('C:\\Users\\zdb\\Desktop\\') shutil.move('C:\\Users\\zdb\\Desktop\\a\\a.txt', 'E:\\b') # 把TXT移动到E盘b文件夹
例2:移动文件,且重命名:桌面有a\a.txt,把它移动到E盘b文件夹,且重命名为b.txt(实现改名)
注意:若目标文件b夹不存在会报错
import shutil, os os.chdir('C:\\Users\\zdb\\Desktop\\') shutil.move('C:\\Users\\zdb\\Desktop\\a\\a.txt', 'E:\\b\\b.txt') # 把TXT移动到E盘b文件夹,且重命名b
3. 删除文件
- 用os.unlink(path)将删除path处的文件
- 用os.rmdir(path)将删除path处的文件夹。该文件夹必须为空
- 用shutil.rmtree(path)将删除path处的文件夹。文件夹中所有文件也删除
注意:删除不可逆,不要轻易删除,最好先打印输出一遍要删除的文件,防止删错文件
import os for filename in os.listdir(): if filename.endswith('.rxt'): print(filename) #os.unlink(filename)
- shutil.rmtree()函数删除不可逆,但是使用send2trash模块可以删除到回收站,而不是永久删除跳过回收站
import send2trash file = open('C:\\Users\\zdb\\Desktop\\a.txt', 'a') # 创建a.txt file.write('abc123') # 写入数据 file.close() # 关闭文件 send2trash.send2trash('C:\\Users\\zdb\\Desktop\\a.txt') #删除到回收站
例:遍历目录树
import os # os.walk()返回三个值: # 当前文件夹名称的字符串 # 当前文件夹中子文件夹的字符串的列表 # 当前文件夹中文件的字符串的列表 for folderName, subfolders, filenames in os.walk("c:\\delicious"): print("The current folder is " + folderName) for subfolder in subfolders: print("Subfolders of " + folderName + ": " + subfolder) for filename in filenames: print("FILE INSIDE " + folderName + ": " + filename)
3.2 处理压缩文件:读取、解压、创建
1. 读取zip文件
要读取zip文件,就要先创建一个ZipFile对象,用zipfile.ZipFile()函数创建
例:example压缩包中有a文件夹和c.txt文件,a文件夹下还有a.txt和b.txt
import zipfile, os os.chdir('C:\\Users\\zdb\\Desktop\\') example_zip = zipfile.ZipFile('example.zip') print(example_zip.namelist()) # 输出文件名列表 file = example_zip.getinfo('c.txt') print(file.file_size) # 输出源文件大小 print(file.compress_size) # 输出压缩后文件大小 example_zip.close()
['a/', 'a/a.txt', 'a/b.txt', 'c.txt'] 0 0
2. 从zip文件中解压缩
- ZipFile对象的extractall()方法从zip文件中解压缩所有文件和文件夹,放到当前工作目录中
import zipfile, os os.chdir('C:\\Users\\zdb\\Desktop\\') example_zip = zipfile.ZipFile('example.zip') example_zip.extractall() example_zip.close()
解压前:
解压后如下:压缩包不会消失
- example_zip.extract()可解压单个文件,第一个参数指定需解压的文件;第二个参数指定路径
import zipfile, os os.chdir('C:\\Users\\zdb\\Desktop\\') example_zip = zipfile.ZipFile('example.zip') example_zip.extract('c.txt', 'C:\\Users\\zdb\\Desktop\\') # 将c.txt解压到桌面 example_zip.close()
3. 创建和添加到zip文件
- 要创建压缩文件需要用写的形式打开文件,write()写入,第一个参数表示需要压缩的文件,第二个参数是“压缩类型”参数。
import zipfile, os os.chdir('C:\\Users\\zdb\\Desktop\\') new_zip = zipfile.ZipFile('new.zip', 'w') new_zip.write('c.txt', compress_type=zipfile.ZIP_DEFLATED) # 把c.txt添加到new_zip里面 new_zip.close()
四. 处理xlsx
工作簿基本介绍:
- 一个工作簿扩展名为.xlsx
- 每个工作簿可以包含多个表
- 列名ABCD、行名1234
4.1 openpyxl介绍
安装:pip install openpyxl
openpyxl中有三个不同层次的类,Workbook是对工作簿的抽象,Worksheet是对表格的抽象,Cell是对单元格的抽象,每一个类都包含了许多属性和方法。
操作Excel的一般场景:
- 打开或者创建一个Excel需要创建一个Workbook对象
- 获取一个表则需要先创建一个Workbook对象,然后使用该对象的方法来得到一个Worksheet对象
- 如果要获取表中的数据,那么得到Worksheet对象以后再从中获取代表单元格的Cell对象
Workbook对象提供的部分属性如下:
- active:获取当前活跃的Worksheet
- worksheets:以列表的形式返回所有的Worksheet(表格)
- read_only:判断是否以read_only模式打开Excel文档
- encoding:获取文档的字符集编码
- properties:获取文档的元数据,如标题,创建者,创建日期等
- sheetnames:获取工作簿中的表(列表)
import openpyxl wb = openpyxl.load_workbook('C:\\Users\\zdb\\Desktop\\test.xlsx') print('workbook的常见属性:------------------') print('当前活跃的worksheet为:', wb.active) print('表格有:', wb.worksheets) print('是否为只读打开:', wb.read_only) print('编码格式为:', wb.encoding) print('文档的标题、创建者、创建日期为:', wb.properties) print('工作簿中的表:', wb.sheetnames)
workbook的常见属性:------------------ 当前活跃的worksheet为: <Worksheet "Sheet3"> 表格有: [<Worksheet "Sheet1">, <Worksheet "Sheet2">, <Worksheet "Sheet3">] 是否为只读打开: False 编码格式为: utf-8 文档的标题、创建者、创建日期为: <openpyxl.packaging.core.DocumentProperties object> Parameters: creator='zdb', title=None, description=None, subject=None, identifier=None, language=None, created=datetime.datetime(2015, 6, 5, 18, 19, 34), modified=datetime.datetime(2021, 3, 8, 2, 52, 52), lastModifiedBy='zdb', category=None, contentStatus=None, version=None, revision=None, keywords=None, lastPrinted=None 工作簿中的表: ['Sheet1', 'Sheet2', 'Sheet3']