目录
知识点
第一部分:文件概述
第二部分:文件的基本操作
第三部分:目录管理
第四部分:CSV文件读写
第五部分:openpyxl等模块
小结
实验
知识点
第一部分:文件概述
- 文件标识:找到计算机中唯一确定的文件。组成包括文件路径、文件名主干和文件扩展名。
- 文件类型:区分了文本文件和二进制文件,并解释了它们的编码方式和存储形式。 文本文件通常以行为单位存储数据,使用ASCII、UNICODE、UTF-8等编码; 二进制文件则以二进制形式存储,如可执行文件、图像、声音和视频等。
- 注意: 计算机在物理层面上以二进制形式存储数据; 文本文件与二进制文件的区别不在于物理上的存储方式,而是逻辑上数据的组织方式。
- 示例:使用不同编码方式存储整数112185
- 文本文件存放形式
- 二进制文件存放形式
第二部分:文件的基本操作
- 打开文件:通过Python的内置方法和os模块中定义的方法可以操作文件。使用Python内置的
open
函数打开文件的过程,包括文件名和访问模式的指定,以及不同访问模式的含义。- open(文件名,访问模式) “文件名”必填 “访问模式”可选 open(‘itheima.txt‘, ’w‘) #open函数默认encoding为utf-8
- 注意:如果使用open函数打开文件时,如果没有注明访问模式,则必须保证文件是存在的,否则会报异常。FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
- 文件读写:
- file1 = open('E:\\a.txt') # 以只读方式打开E盘的文本文件
- file2 = open('b.txt', 'w') # 以只写方式打开当前目录的文件
- file3 = open('c.txt', 'w+') # 以读/写方式打开文本文件
- file4 = open('d.txt', 'wb+') # 以读/写方式打开二进制文件
- 读取文件的方法
- read():从指定文件读取指定字节的数据。语法格式为:read(n=-1)
- readline():从指定文件读取一行数据。语法格式为:readline() 。
- readlines() :读取指定文件中的全部数据,并按行存储到列表之中。文件中的每一行对应列表中的一个元素。语法格式为:readlines(hint=-1)
- read() VS readlines()方法
- read()(参数缺省时)和readlines()方法都可一次读取文件中的全部数据但因为计算机的内存是有限的,若文件较大,read()和readlines()的一次读取便会耗尽系统内存,所以这两种操作都不够安全。 为了保证读取安全,通常多次调用read()方法,每次读取size字节的数据。
- 写文件的方法
- write()可以将指定字符串写入文件,格式为:write(data)data为要写入的数据,每调用一次,写入的数据就会追加到文件末尾。
- writelines()用于将行列表写入文件,格式:writelines(lines),lines表示要写入文件中的数据,可以是一个字符串或者字符串列表。 若写入文件的数据在文件中需要换行,需要显式指定换行符。
- 字符与编码:文本文件支持多种编码方式,不同编码方式下字符与字节的对应关系不同,常见的编码方式以及字符与字节的对应关系如表所示。
- 文件定位读写:Python提供了一些获取与修改文件读写位置的方法,用于获取和控制文件的读写位置。
- tell():获取文件当前的读写位置。
- seek():控制文件的读写位置。实现文件的随机读写。语法格式:seek(offset, from) ,调用成功后会返回当前读写位置。
- offset:表示偏移量,即读写位置需要移动的字节数。 from:用于指定文件的读写位置,0(文件开头)、1(当前读写位置)、2(文件末尾)
第三部分:目录管理
- OS模块:os模块中定义了与文件操作相关的函数,利用这些函数可以实现删除文件、重命名文件、创建和删除目录、获取当前目录、更改默认目录和获取目录列表等。
- 删除文件——os.remove(文件名)
- 文件重命名——os.rename(原文件名,新文件名)
- 创建/删除目录——os.mkdir(目录名)/os.rmdir(目录名)
- 获取当前目录——os.getcwd()
- 更改默认目录——os.chdir(路径名)
- 获取目录列表——os.listdir(目录/路径)
- 1、查询工作路径
- path = os.getcwd() # 查询当前工作目录,并赋值给path
- print(path)
- 2、查询指定目录下面的文件
- os.listdir(path) # 查询当前工作目录下的文件
- 3、删除文件
- os.remove(r'C:\1.txt') # 删除指定文件
- 4、创建与删除目录
- file_name = 'C:\\Users\\my_file'
- os.mkdir(file_name) # 创建文件夹
- os.rmdir(file_name) # 删除文件夹(只能删除空目录)
第四部分:CSV文件读写
- 数据维度:基于维度的数据分类,包括一维数据、二维数据和多维数据的概念。
- CSV文件格式规范:CSV文件的存储格式,字段的分隔方式和CSV文件的用途。
- 以纯文本形式存储表格数据
- 文件的每一行对应表格中的一条数据记录
- 每条记录由一个或多个字段组成
- 字段之间使用逗号(英文、半角)分隔
- Windows系统中CSV文件的后缀名为.csv,可通过Excel或记事本打开
- 读/写CSV文件:使用基本的文件操作和
csv
模块。- Python在程序中读取.csv文件后会以二维列表形式存储其中内容。
- 用命令import csv即可直接调用csv模块进行csv文件的读写。
- 将一、二维数据写入文件中,在文件中添加新的数据。
第五部分:openpyxl等模块
小结
- 主要讲解了与文件和数据格式化相关的知识,包括文件概述、文件的基本操作(文件打开/关闭、txt文件读写)、文件操作模块os以及csv文件读写等。 通过本章的学习,了解计算机中文件的意义,熟练读取、更改文件,熟悉文件操作模块,并掌握常见的数据组织形式。
实验
一、实验目的:
1.熟练python编辑器pycharm的使用。
2.掌握python的程序控制结构
3.掌握python的文件相关函数,理解函数的功能
4.熟练掌握python的文件输入流和输出流,能掌握相关代码
5.清楚文件数据的格式,并且掌握相关数据的格式的代码
二、实验内容:
说明:基础题为必做题,提高题为选做题
- (基础题) 写一段程序能够将用户输入的用户名和密码保存到一个txt文件中。
运行截图:
程序代码:
import os
import sys
# 获取用户输入的用户名和密码
username = input("请输入用户名:")
password = input("请输入密码:")
# 将用户名和密码保存到文件中
try:
with open('userinfo.txt', 'w') as file: # 使用'w'模式打开文件,如果文件不存在则创建
file.write(f'用户名:{username}\n密码:{password}')
print("用户名和密码已保存成功!")
except IOError as e:
print(f"保存文件时发生错误
:{e}")
2.(基础题) 在实验题1的基础上,再另外写一段程序能读取上述文件中的用户名和密码,实现登录功能。
运行截图:
程序代码:
import os
import sys
def login():
# 提示用户输入用户名和密码
input_username = input("请输入用户名:")
input_password = input("请输入密码:")
try:
# 打开保存用户名和密码的文件
with open('userinfo.txt', 'r') as file:
lines = file.readlines() # 读取所有行
# 检查输入的用户名和密码是否与文件中的匹配
if len(lines) >= 2 and lines[0].strip() == f'用户名:{input_username}' and lines[1].strip() == f'密码:{input_password}':
print("登录成功!")
else:
print("用户名或密码错误!")
except IOError as e:
print(f"读取文件时发生错误:{e}")
# 调用登录函数
login()
3.(基础题)文件准备:在D盘新建一个文件夹a,a下有3个txt文件,分别是1.txt,2.txt,3.txt,文件内容随意填写。
要求:请编写程序代码,在C盘下新建一个文件夹test,然后将整a文件夹拷贝到test下。
运行截图:
程序代码:
import os
import shutil
# 源文件夹路径
source_folder = 'D:\\a'
# 目标文件夹路径
destination_folder = 'C:\\test'
# 确保源文件夹存在
if not os.path.exists(source_folder):
print(f"源文件夹 {source_folder} 不存在。")
else:
# 如果目标文件夹不存在,则创建它
if not os.path.exists(destination_folder):
os.makedirs(destination_folder)
# 确保目标文件夹是空的,如果不是,则清空它
if os.listdir(destination_folder):
for filename in os.listdir(destination_folder):
file_path = os.path.join(destination_folder, filename)
if os.path.isfile(file_path) or os.path.islink(file_path):
os.unlink(file_path) # 删除文件或链接
elif os.path.isdir(file_path):
shutil.rmtree(file_path) # 删除目录树
# 复制整个文件夹
shutil.copytree(source_folder, os.path.join(destination_folder, 'a'))
print(f"文件夹 {source_folder} 已成功复制到 {destination_folder} 下。")
4. (提高题) 打开一个文本文件,编写程序读取其内容,并把其中的大写字母变成小写字母,小写字母变成大写字母。
(可以手动新建一个文件,hello.txt,内容如下:
Rain is falling all around,
It falls on field and tree,
It rains on the umbrella here,
And on the ships at sea.)
运行截图:
程序代码:
# 要处理的文件路径
input_file_path = 'hello.txt'
# 输出文件路径,这里我们覆盖原文件
output_file_path = 'hello_transformed.txt'
# 读取文件内容
try:
with open(input_file_path, 'r') as file:
content = file.read()
# 转换大小写
transformed_content = content.swapcase()
# 将转换后的内容写回文件
with open(output_file_path, 'w') as file:
file.write(transformed_content)
print(f"文件 '{input_file_path}' 的内容已转换并保存到 '{output_file_path}'。")
except IOError as e:
print(f"处理文件时发生错误:{e}")
5. (提高题) 已知一个学生成绩表score.csv文件中存放着学生的姓名与各科成绩,请从取该成绩表中的数据,统计每位学生的总成绩(各科成绩之和),然后将各科成绩及总分写入一个新文件count.csv中。
思路提示:
#从csv文件中读取表格数据
#读取每一行,第一行lines[0]之后追加"总分",即lines[i].append('总分')
#之后每一行计算lines[i][1]~lines[i][len(lines[i])-1]的和
#将计算结果追加到lines[i]中
运行效果
原始成绩表score.csv:
追加了总分后的新成绩表count.csv:
程序代码:
import csv
# 原始成绩表文件路径
input_csv_path = 'score.csv'
# 新的成绩表文件路径,包含总分
output_csv_path = 'count.csv'
try:
# 读取原始成绩表
with open(input_csv_path, newline='', encoding='utf-8') as csvfile_in:
reader = csv.reader(csvfile_in)
lines = [line for line in reader]
# 在第一行标题后追加"总分"
lines[0].append('总分')
# 计算每位学生的总成绩并追加到对应的行
for i in range(1, len(lines)):
# 将成绩列(从索引1开始到倒数第二列)转换为整数并求和
total_score = sum(int(lines[i][j]) for j in range(1, len(lines[i])-1))
# 将计算的总分追加到当前行的末尾
lines[i].append(str(total_score))
# 将更新后的成绩表写入新的CSV文件
with open(output_csv_path, 'w', newline='', encoding='utf-8') as csvfile_out:
writer = csv.writer(csvfile_out)
writer.writerows(lines)
print(f"更新后的成绩表已保存到 '{output_csv_path}'.")
except IOError as e:
print(f"处理CSV文件时发生错误:{e}")
except ValueError as e:
print(f"转换成绩时发生错误:{e}")