python文件与数据格式化

文章目录

  • python文件与数据格式化
    • [1 文件概述](#1 文件概述)
      • [1.1 文件标识](#1.1 文件标识)
      • [1.2 文件类型](#1.2 文件类型)
      • [1.3 标准文件](#1.3 标准文件)
    • [2 文件的基础操作](#2 文件的基础操作)
      • [2.1 文件的打开与关闭](#2.1 文件的打开与关闭)
        • [1. 打开文件](#1. 打开文件)
        • [2. 关闭文件](#2. 关闭文件)
      • [2.2 文件的读写](#2.2 文件的读写)
      • [2.3 文件的定位读写](#2.3 文件的定位读写)
        • [1. `tell()`方法](#1. tell()方法)
        • [2. `seek()`方法](#2. seek()方法)
    • [3 文件与目录管理](#3 文件与目录管理)
      • [3.1 删除文件](#3.1 删除文件)
      • [3.2 文件重命名](#3.2 文件重命名)
      • [3.3 获取当前目录](#3.3 获取当前目录)
      • [3.4 创建/删除目录](#3.4 创建/删除目录)
      • [3.5 更改默认目录](#3.5 更改默认目录)
      • [3.6 获取文件名列表](#3.6 获取文件名列表)
    • [4 数据维度与数据格式化](#4 数据维度与数据格式化)
      • [4.1 基于维度的数据分类](#4.1 基于维度的数据分类)
        • [1. 一维数据](#1. 一维数据)
        • [2. 二维数据](#2. 二维数据)
        • [3. 多维数据](#3. 多维数据)
      • [4.2 一维数据和二维数据的存储与读写](#4.2 一维数据和二维数据的存储与读写)
        • [1. 数据存储](#1. 数据存储)
        • [2. 数据读取](#2. 数据读取)
        • [3. 数据写入](#3. 数据写入)
      • [4.3 多维数据的格式化](#4.3 多维数据的格式化)
    • [5 实训案例](#5 实训案例)
      • [5.1 信息安全策略-文件备份](#5.1 信息安全策略-文件备份)
      • [5.2 用户账户管理](#5.2 用户账户管理)
    • 本章总结

python文件与数据格式化

1 文件概述

1.1 文件标识

  • 文件标识的意义:找到计算机中唯一确定的文件
  • 文件标识的组成
    • 文件路径
    • 文件名主干
    • 文件扩展名

1.2 文件类型

根据数据的逻辑存储结构,文件分为:

  1. 文本文件

    • 专门存储文本字符数据(使用记事本)
    • 示例:.txt, .csv, .json
  2. 二进制文件

    • 不能直接使用文字处理程序正常读写,必须了解其结构和序列化规则
    • 示例:图片、音频、视频等

注意:二进制文件和文本文件这两种类型的划分基于数据逻辑存储结构而非物理存储结构,计算机中的数据在物理层面都以二进制形式存储。

1.3 标准文件

Python的sys模块中定义了3个标准文件:

  • stdin(标准输入文件):对应输入设备,如键盘
  • stdout(标准输出文件):对应输出设备,如显示器
  • stderr(标准错误文件):对应输出设备,如显示器
python 复制代码
import sys
file = sys.stdout
file.write('hello world')

2 文件的基础操作

2.1 文件的打开与关闭

1. 打开文件

内置函数open()用于打开文件:

python 复制代码
open(file, mode='r', buffering=None)

参数说明:

  • file:文件的路径
  • mode:设置文件的打开模式(默认为r
  • buffering:设置访问文件的缓冲方式(取值为0或1)

打开模式:

模式 名称 描述
r/rb 只读模式 以只读的形式打开文本文件/二进制文件,若文件不存在或无法找到,文件打开失败
w/wb 只写模式 以只写的形式打开文本文件/二进制文件,若文件已存在,则重写文件,否则创建新文件
a/ab 追加模式 以只写的形式打开文本文件/二进制文件,只允许在该文件末尾追加数据,若文件不存在,则创建新文件
r+/rb+ 读取(更新)模式 以读/写的形式打开文本文件/二进制文件,若文件不存在,文件打开失败
w+/wb+ 写入(更新)模式 以读/写的形式打开文本文件/二进制文件,若文件已存在,则重写文件
a+/ab+ 追加(更新)模式 以读/写的形式打开文本文件/二进制文件,只允许在文件末尾添加数据,若文件不存在,则创建新文件

示例:

python 复制代码
# 以只读方式打开文本文件
file1 = open('f:\\a.txt')

# 以只写方式打开文本文件,若文件不存在则自动创建
file2 = open('f:\\b.txt','w')

# 以读/写方式打开文本文件,若文件不存在则自动创建
file3 = open('f:\\c.txt','w+')

# 以读/写方式打开二进制文件,若文件不存在则自动创建
file4 = open('f:\\d.txt','wb+') 
2. 关闭文件

Python可通过close()方法关闭文件,也可以使用with语句实现文件的自动关闭。

python 复制代码
# 方法一:使用close()
file = open('f:\\a.txt')
# 文件操作...
file.close()

# 方法二:使用with语句(推荐)
with open('f:\\a.txt') as f:
    print('文件关闭')
    pass  # 文件操作结束后会自动关闭文件

为什么及时关闭文件?

  1. 计算机中可打开的文件数量是有限的
  2. 打开的文件占用系统资源
  3. 若程序因异常关闭,可能产生数据丢失

2.2 文件的读写

1. 读取文件方法
a) read()方法

从指定文件中读取指定字节的数据:

python 复制代码
read(size)  # size:表示要从文件中读取的数据的长度,单位:字节

示例:

python 复制代码
file = open('e:\\TestTool\\demo\\demo1.txt','r')
connect = file.read(2)
print(connect)
print('-'*30)
connect = file.read()
print(connect)
file.close()

b) readline()方法

从指定文件中读取一行数据:

python 复制代码
readline()

示例:

python 复制代码
with open('e:\\TestTool\\demo\\demo1.txt','r') as f:
    print(f.readline())
    print(f.readline())
c) readlines()方法

一次读取文件中的所有数据,返回一个列表:

python 复制代码
readlines(hint=-1)  # hint:单位为字节,控制要读取的行数

示例:

python 复制代码
import chardet

with open('e:\\TestTool\\demo\\demo1.txt', 'rb') as f:
    raw_data = f.read()
    encoding = chardet.detect(raw_data)['encoding']
with open('e:\\TestTool\\demo\\demo1.txt', 'r', encoding=encoding, errors='ignore') as f:
    print(f.readlines())

总结

  • read()(参数缺省时)和readlines()方法都可一次读取文件中的全部数据
  • 对于大文件,应多次调用read()方法,每次读取size字节的数据,避免耗尽系统内存
2. 写入文件方法
a) write()方法

将指定字符串写入文件:

python 复制代码
write(data)  # data:要写入文件的数据

示例:

python 复制代码
string = 'I am planning to write Python' 
with open('e:\\TestTool\\demo\\demo1.txt',mode='w',encoding='utf-8') as f:
    size = f.write(string)      # 写入内容
    print(size)      # 输出字节数
b) writelines()方法

将行列表写入文件:

python 复制代码
writelines(lines)  # lines:要写入文件中的数据(字符串或字符串列表)

示例:

python 复制代码
string = ['Life is short\n','I use python'] 
with open('e:\\TestTool\\demo\\demo1.txt',mode='w',encoding='utf-8') as f:
    size = f.writelines(string)      # 写入内容
    print(size)      # 写入成功,无任何输出信息

注意

  • write:将字符串写入文件,适用于单行写入,参数必须是字符串类型
  • writelines:将字符串按行写入文件,适用于多行写入,可以接受字符串序列
3. 字符与编码

文本文件支持多种编码方式,不同编码方式下字符与字节的对应关系不同:

编码方式 语言字符 数字字节数
ASCII 中文 2
英文 1
UTF-8 中文 3
英文 1
Unicode 中文 2
英文 2
GBK 中文 2
英文 1

2.3 文件的定位读写

1. tell()方法

获取文件当前的读写位置:

python 复制代码
tell()

示例:

python 复制代码
with open('e:\\TestTool\\demo\\demo1.txt') as f:
    print(f.tell())      # 获取文件读写位置(0)
    print(f.read(5))     # 读取5个字符
    print(f.tell())      # 再次获取文件读写位置(5)
2. seek()方法

控制文件的读写位置,实现文件的随机读写:

python 复制代码
seek(offset, from)

参数:

  • offset:偏移量(字节)
  • from:指定文件的读写位置
    • 0:文件开头(默认)
    • 1:当前读写位置
    • 2:文件末尾

示例:

python 复制代码
# 相对于文件开头移动
with open('f:\\lucky.txt') as f:
    f.tell()            # 获取文件读写位置
    sep = f.seek(5, 0)   # 相对文件首部移动5字节
    print(sep)          # 输出当前文件读写位置(5)

# 相对于当前位置移动(需要二进制模式)
with open('f:\\lucky.txt','rb') as f:
    f.seek(5, 0)        # 相对文件首部移动5字节
    sep = f.seek(3, 1)   # 相对当前位置移动3字节
    print(sep)          # 输出8

注意 :在Python3中,若打开的是文本文件,seek()方法只允许相对于文件开头移动位置。若要相对当前读写位置或文件末尾进行位移操作,需以二进制形式打开文件。

3 文件与目录管理

使用os模块中的函数管理文件和目录:

3.1 删除文件

python 复制代码
remove(文件名)

示例:

python 复制代码
import os
os.remove('e:\\TestTool\\demo\\demo1.txt')

3.2 文件重命名

python 复制代码
rename(原文件名, 新文件名)

示例:

python 复制代码
import os
os.rename('e:\\TestTool\\demo\\demo1.txt','e:\\TestTool\\demo\\demo01.txt')

3.3 获取当前目录

python 复制代码
getcwd()

示例:

python 复制代码
import os
print(os.getcwd())  # 输出当前工作目录的绝对路径

3.4 创建/删除目录

python 复制代码
mkdir(目录名)  # 创建目录
rmdir(目录名)  # 删除目录

示例:

python 复制代码
import os
os.mkdir('e:\\abc')   # 创建目录
os.rmdir('e:\\abc')   # 删除目录

3.5 更改默认目录

python 复制代码
chdir(路径)

示例:

python 复制代码
import os
print('更改前默认路径:', os.getcwd())
os.chdir('e:\\')     # 更改默认目录为F盘
print('更改后默认路径:', os.getcwd())

3.6 获取文件名列表

python 复制代码
listdir(路径)

示例:

python 复制代码
import os
dirs = os.listdir('e:\\TestTool\\demo')  # 获取当前目录下所有文件
print(dirs)              # 输出文件名列表

4 数据维度与数据格式化

4.1 基于维度的数据分类

1. 一维数据

具有对等关系的一组线性数据:

  • 一维列表
  • 一维元组
  • 集合
2. 二维数据

二维数据关联参数的数量为2:

  • 矩阵
  • 二维数组
  • 二维列表
  • 二维元组
3. 多维数据

利用键值对等简单的二元关系展示数据间的复杂结构:

  • 字典

4.2 一维数据和二维数据的存储与读写

1. 数据存储
  • 一维数据:用特殊字符分隔,如:

    • 使用空格:成都 杭州 重庆 武汉 苏州 西安 天津
    • 使用逗号:成都,杭州,重庆,武汉,苏州,西安,天津
    • 使用&:成都&杭州&重庆&武汉&苏州&西安&天津
  • 二维数据:CSV(Comma-Separated Values,逗号分隔值)格式:

    • 纯文本形式存储表格数据
    • 每一行对应表格中的一条记录
    • 记录由字段组成,字段之间使用逗号分隔

示例CSV文件(info.csv):

复制代码
姓名,语文,数学,英语,理综
刘备,124,137,145,260
张飞,116,143,139,263
关羽,120,130,148,255
周瑜,115,145,131,240
诸葛亮,123,108,121,235
黄月英,132,100,112,210
2. 数据读取

读取CSV文件:

python 复制代码
import chardet

def open_file(address):
    with open(address, 'rb') as f:
        raw_data = f.read()
        return chardet.detect(raw_data)['encoding']

addr = 'e:\\TestTool\\demo\\info.csv'
with open(addr, encoding=open_file(addr), errors='ignore') as f:
    lines = []
    for line in f:
        line = line.replace('\n', '')
        lines.append(line.split(','))
    print(lines)
3. 数据写入

向CSV文件写入数据(添加每名学生的总分):

python 复制代码
import chardet
def open_file(address):
    with open(address, 'rb') as f:
        raw_data = f.read()
        return chardet.detect(raw_data)['encoding']
addr = 'e:\\TestTool\\demo\\info.csv'
with open(addr, encoding=open_file(addr), errors='ignore') as f:
    file_new = open('e:\\TestTool\\demo\\count.csv', 'w+')
    lines = []
    for line in f:
        line = line.replace('\n', '')
        lines.append(line.split(','))
    # 添加表头字段        
    lines[0].append('total')
    # 添加总计
    for i in range(len(lines) - 1):
        idx = i + 1
        sun_score = 0
        for j in range(len(lines[idx])):
            if lines[idx][j].isnumeric():
                sun_score += int(lines[idx][j])
        lines[idx].append(str(sun_score))
    for line in lines:
        print(line)
        file_new.write(','.join(line) + '\n')

4.3 多维数据的格式化

1. JSON格式

JSON格式规则:

  • 数据存储在键值对(key:value)中
  • 数据的字段由逗号分隔
  • 花括号保存一个JSON对象
  • 方括号保存一个数组

示例:

json 复制代码
{
  "班级考试成绩": [
    {"姓名": "王小天", "语文": "124", "数学": "127", "英语": "145", "理综": "259"},
    {"姓名": "张大同", "语文": "116", "数学": "143", "英语": "119", "理综": "273"}
  ]
}
2. Python对象与JSON数据转换
a) dumps()函数:Python对象 → JSON字符串
python 复制代码
import json

pyobj = [[1,2,3],10,3,14,'tom',{'java':98,'python':100},True,False,None]
jsonobj = json.dumps(pyobj)
print(jsonobj) 
b) loads()函数:JSON字符串 → Python对象
python 复制代码
import json

pyobj = [[1,2,3],10,3,14,'tom',{'java':98,'python':100},True,False,None]
jsonobj = json.dumps(pyobj)
print(jsonobj)

# 反序列化操作
new_obj = json.loads(jsonobj)
print(new_obj)

Python对象与JSON数据转化时的类型对照表:

Python对象 JSON数据
dict object
list, tuple array
str, unicode string
int, long, float number
True true
False false
None null

5 实训案例

5.1 信息安全策略-文件备份

实现一个具有备份文件与文件夹功能的备份工具:

python 复制代码
import os
import shutil
import time

def backup_files(source, destination):
    """
    备份文件或文件夹
  
    参数:
        source: 源文件/文件夹路径
        destination: 目标备份路径
    """
    try:
        # 检查源是否存在
        if not os.path.exists(source):
            print(f"源路径 {source} 不存在!")
            return
      
        # 创建目标目录(如果不存在)
        os.makedirs(destination, exist_ok=True)
      
        # 获取当前时间,用于创建备份文件夹
        current_time = time.strftime("%Y%m%d_%H%M%S")
        backup_folder = os.path.join(destination, f"backup_{current_time}")
        os.makedirs(backup_folder)
      
        # 复制文件或文件夹
        if os.path.isfile(source):
            shutil.copy2(source, backup_folder)
            print(f"文件 {source} 已备份到 {backup_folder}")
        else:
            shutil.copytree(source, os.path.join(backup_folder, os.path.basename(source)))
            print(f"文件夹 {source} 已备份到 {backup_folder}")
          
    except Exception as e:
        print(f"备份过程中发生错误: {e}")

# 示例使用
if __name__ == "__main__":
    source_path = input("请输入要备份的文件/文件夹路径: ")
    dest_path = input("请输入备份目标路径: ")
    backup_files(source_path, dest_path)

5.2 用户账户管理

实现包含用户注册、登录、修改密码和注销功能的用户账户管理程序:

python 复制代码
import json
import os

class UserManager:
    def __init__(self, file_path='users.json'):
        self.file_path = file_path
        self.users = self.load_users()
  
    def load_users(self):
        """加载用户数据"""
        if os.path.exists(self.file_path):
            with open(self.file_path, 'r', encoding='utf-8') as f:
                return json.load(f)
        return {}
  
    def save_users(self):
        """保存用户数据"""
        with open(self.file_path, 'w', encoding='utf-8') as f:
            json.dump(self.users, f, ensure_ascii=False, indent=4)
  
    def register(self, username, password):
        """用户注册"""
        if username in self.users:
            print(f"用户名 {username} 已存在!")
            return False
      
        self.users[username] = {
            'password': password,
            'created_time': self.get_current_time()
        }
        self.save_users()
        print(f"用户 {username} 注册成功!")
        return True
  
    def login(self, username, password):
        """用户登录"""
        if username not in self.users:
            print(f"用户名 {username} 不存在!")
            return False
      
        if self.users[username]['password'] != password:
            print("密码错误!")
            return False
      
        print(f"用户 {username} 登录成功!")
        return True
  
    def change_password(self, username, old_password, new_password):
        """修改密码"""
        if username not in self.users:
            print(f"用户名 {username} 不存在!")
            return False
      
        if self.users[username]['password'] != old_password:
            print("原密码错误!")
            return False
      
        self.users[username]['password'] = new_password
        self.users[username]['modified_time'] = self.get_current_time()
        self.save_users()
        print(f"用户 {username} 的密码已修改!")
        return True
  
    def delete_account(self, username, password):
        """注销账户"""
        if username not in self.users:
            print(f"用户名 {username} 不存在!")
            return False
      
        if self.users[username]['password'] != password:
            print("密码错误!")
            return False
      
        del self.users[username]
        self.save_users()
        print(f"用户 {username} 已注销!")
        return True
  
    def get_current_time(self):
        """获取当前时间字符串"""
        from datetime import datetime
        return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

def main():
    manager = UserManager()
  
    while True:
        print("\n===== 用户管理系统 =====")
        print("1. 注册")
        print("2. 登录")
        print("3. 修改密码")
        print("4. 注销账户")
        print("5. 退出")
      
        choice = input("请选择操作(1-5): ")
      
        if choice == '1':
            username = input("请输入用户名: ")
            password = input("请输入密码: ")
            manager.register(username, password)
      
        elif choice == '2':
            username = input("请输入用户名: ")
            password = input("请输入密码: ")
            manager.login(username, password)
      
        elif choice == '3':
            username = input("请输入用户名: ")
            old_password = input("请输入原密码: ")
            new_password = input("请输入新密码: ")
            manager.change_password(username, old_password, new_password)
      
        elif choice == '4':
            username = input("请输入用户名: ")
            password = input("请输入密码: ")
            manager.delete_account(username, password)
      
        elif choice == '5':
            print("感谢使用,再见!")
            break
      
        else:
            print("无效的选择,请重新输入!")

if __name__ == "__main__":
    main()

本章总结

本章主要介绍了文件与数据格式化相关的知识,包括:

  1. 文件概述

    • 文件标识的组成和意义
    • 文件类型(文本文件和二进制文件)
    • 标准文件(stdin、stdout、stderr)
  2. 文件的基础操作

    • 文件的打开与关闭(open()with语句)
    • 文件的读写方法(read()readline()readlines()write()writelines()
    • 文件的定位读写(tell()seek()
  3. 文件与目录管理

    • 使用os模块进行文件和目录管理(删除、重命名、创建目录等)
  4. 数据维度与数据格式化

    • 基于维度的数据分类(一维、二维、多维数据)
    • 一维和二维数据的存储与读写(CSV格式)
    • 多维数据的格式化(JSON格式)
  5. 实训案例

    • 文件备份工具
    • 用户账户管理系统

_account(username, password)

复制代码
    elif choice == '5':
        print("感谢使用,再见!")
        break
  
    else:
        print("无效的选择,请重新输入!")

if name == "main ":

main()

复制代码
## 本章总结

本章主要介绍了文件与数据格式化相关的知识,包括:

1. **文件概述**
   - 文件标识的组成和意义
   - 文件类型(文本文件和二进制文件)
   - 标准文件(stdin、stdout、stderr)

2. **文件的基础操作**
   - 文件的打开与关闭(`open()`和`with`语句)
   - 文件的读写方法(`read()`、`readline()`、`readlines()`、`write()`、`writelines()`)
   - 文件的定位读写(`tell()`和`seek()`)

3. **文件与目录管理**
   - 使用`os`模块进行文件和目录管理(删除、重命名、创建目录等)

4. **数据维度与数据格式化**
   - 基于维度的数据分类(一维、二维、多维数据)
   - 一维和二维数据的存储与读写(CSV格式)
   - 多维数据的格式化(JSON格式)

5. **实训案例**
   - 文件备份工具
   - 用户账户管理系统

通过本章的学习,我们能够了解计算机中文件的意义,熟练地读取和管理文件,并掌握常见的数据组织形式,为后续的Python运维工作打下坚实基础。
相关推荐
weixin_440730503 小时前
java结构语句学习
java·开发语言·学习
JIngJaneIL3 小时前
基于java+ vue医院管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
量子联盟3 小时前
功能完整的PHP站点导航管理系统php程序;开源免费下载
开发语言·php
仙俊红3 小时前
在 Java 中,`==` 和 `equals()` 的区别
java·开发语言·jvm
信创天地3 小时前
信创国产化数据库的厂商有哪些?分别用在哪个领域?
数据库·python·网络安全·系统架构·系统安全·运维开发
JIngJaneIL3 小时前
基于java + vue校园跑腿便利平台系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
不哦罗密经4 小时前
python相关
服务器·前端·python
happybasic4 小时前
python字典中字段重复性的分析~~
开发语言·python
山海青风4 小时前
人工智能基础与应用 - 数据处理、建模与预测流程 6 模型训练
人工智能·python·机器学习