Python入门实战:文件读写与操作

147 阅读8分钟

1.背景介绍

在数据处理、信息提取、统计分析等应用场景中,如何快速高效地对大量数据进行读写、统计分析以及数据处理,是数据科学家们绕不开的问题。然而,对于初级程序员来说,操作文件、数据的基本语法知识还是比较欠缺的。所以,本文通过一些实例和深入浅出的讲解,让初级程序员能够快速上手操作文件,并掌握一些常用的函数和模块,从而使他们能够更加灵活地解决复杂的数据分析任务。

2.核心概念与联系

  • 读取(read):即将存储设备中的数据读取到内存中,供后续处理或输出显示。读取文件的内容,可以帮助我们获取其中的信息、进行数据分析、提取有效信息。
  • 写入(write):将内存中的数据保存至存储设备中,以便长久保存、存储或传输。写入文件可以保存所需数据,或者用于创建新文件。
  • 操作系统(OS):操作系统(Operating System,简称 OS),也称作内核,它负责管理硬件资源及提供各种服务。不同类型的操作系统提供不同的接口,使得应用程序可以方便地和硬件系统进行交互。目前最流行的 Windows、macOS 和 Linux 操作系统均属于类 Unix 风格的操作系统。
  • Python语言:Python 是一种简洁、高层次的编程语言,它的设计哲学强调代码可读性,同时具有简洁、明确的特点。其广泛运用在各个领域,包括人工智能、机器学习、Web开发、数据分析等多个领域。

3.核心算法原理和具体操作步骤以及数学模型公式详细讲解

3.1 操作文件

3.1.1 创建/打开/关闭文件

操作文件之前需要先创建一个空白文件,然后再进行读写操作。以下是创建/打开/关闭文件的常用方法。

方法一:使用open()函数

f = open('filename.txt', 'w') # 使用 'w' 表示打开一个文件进行写入(如果该文件不存在则会自动创建)
#... do something with the file (e.g., read or write lines)...
f.close() # 关闭文件

注意:在使用完毕之后务必关闭文件,释放资源,避免占用过多系统资源造成性能下降。

方法二:使用with语句

with open('filename.txt', 'r') as f:
    for line in f:
        print(line, end='')   # 以一行一行的方式打印文件内容

此方法利用了with语句来自动帮我们调用close()方法,不需要手动调用。但是由于Python的垃圾回收机制,当执行完某段代码时,若变量还被其他变量引用,则不会立刻释放,直到最后一个引用被移除时才会释放。因此,这种方法比上面那种方法更容易产生内存泄露。

方法三:通过os模块进行文件操作

除了使用open()函数外,还有一种方法是直接通过系统命令来操作文件。这主要依赖于操作系统提供的系统调用,可以实现更高效率的读写操作。但是操作系统的兼容性可能会比较差,并且对于非文本文件(如图片、音频等)的操作可能会受限。

示例代码如下:

import os

if not os.path.exists('my_file'):    # 检查是否存在文件,不存在则创建
    os.mknod('my_file')
    
with open('my_file', 'rb+') as f:     # 以二进制方式读写文件,文件指针指向文件末尾
    content = f.read()                # 读取整个文件内容
    
    f.seek(0)                         # 将文件指针移动到文件头部
    f.write(b'hello world\n')         # 向文件写入一行字符串
    
    f.seek(-len(content), 2)          # 将文件指针指向倒数第二行的开头位置
    f.truncate()                      # 清除剩余内容
    
print(os.stat('my_file'))            # 获取文件状态信息,包含文件大小、创建时间、修改时间等

3.1.2 读取/写入文件

文件读写是指将文件中的内容读取到内存中供后续处理、或将处理结果写入文件中。下面给出几个常用的文件操作函数。

方法一: read()/readline()方法

这些方法可以用来读取文件的内容。其中,read()方法一次性读取整个文件的内容,并返回一个字符串;readline()方法每次只读取一行内容,并返回一个字符串。

示例代码如下:

with open('test.txt', 'r') as f:
    contents = f.read()           # 读取整个文件的内容
    first_line = f.readline()     # 读取第一行内容
    second_line = f.readline()    # 读取第二行内容

    while True:                   # 循环读取剩余行内容
        line = f.readline()        # 逐行读取文件内容
        if len(line) == 0:
            break                  # 遇到文件结尾退出循环

        print(line, end='')        # 打印每行内容
        
second_half = ''                 # 初始化空字符串
with open('test.txt', 'r') as f:
    line = f.readline()
    while line!= '':             # 从第二行开始遍历文件内容
        second_half += line       # 添加每行内容至字符串
        line = f.readline()
        
    second_half += line           # 将最后一行添加至字符串

方法二: write()方法

这个方法可以用来向文件写入内容。

示例代码如下:

text = 'Hello, World!\nThis is a test.\n'   # 待写入文件的内容
with open('test.txt', 'w') as f:           # 打开文件进行写入
    f.write(text)                           # 写入文本内容

方法三: seek()/tell()方法

这些方法可以用来设置文件指针的位置,用于控制文件读取的位置。seek()方法可以设置当前文件位置;tell()方法可以获取当前文件位置。

示例代码如下:

with open('test.txt', 'r') as f:
    length = sum([len(line) for line in f])      # 计算文件总字节数
    pos = random.randint(0, length - 1)          # 生成随机读取位置
    
    f.seek(pos)                                  # 设置文件指针位置
    char = f.read(1)                             # 读取单个字符
    
    f.seek(-length+1, 2)                         # 设置文件指针位置到最后一行的开头
    last_char = f.read(1)                        # 读取最后一个字符
    
    
with open('test.txt', 'r') as f:
    for i, line in enumerate(f):                    # 遍历文件内容并统计行号
        pass
        
    rownum = i + 1                                   # 当前行号
        
    f.seek(0, 0)                                      # 重置文件指针位置到文件头
    lines = [line for i, line in enumerate(f)]        # 读取整个文件内容并以列表形式存储
    
    for i, line in enumerate(lines[rownum:]):          # 从当前行往后遍历文件内容
        if keyword in line:                          # 查找关键字所在行
            print("Keyword found at line", i+rownum)    # 输出结果所在行号
            

3.1.3 CSV文件操作

CSV文件全称Comma Separated Values,它是一个纯文本文件,里面记录着以逗号分隔的值。这个文件的作用是在不同程序之间共享数据,可以方便地导入、导出。下面演示如何处理CSV文件。

首先安装csv模块:

pip install csv

这里假设有一个包含姓名、年龄、身高和体重的csv文件,内容如下:

name,age,height,weight
Alice,25,170,70
Bob,30,180,80
Charlie,35,160,65

方法一:读取CSV文件

使用csv模块的reader()函数可以读取CSV文件内容。

import csv

with open('data.csv', newline='') as f:   # 设置newline参数防止在Windows环境下出现空行
    reader = csv.reader(f)              # 创建CSV阅读器对象
    
    for row in reader:                   # 遍历CSV文件的所有行
        name, age, height, weight = row   # 分割每行值
        print('{} is {} years old and {} cm tall'.format(name, age, height))
        
        # 根据每个人的体重决定是否要奖励其健康
        if int(weight) > 90:
            print('Congratulations! You have earned a healthy weight!')

方法二:写入CSV文件

使用csv模块的writerow()函数可以向CSV文件中写入一行数据。

import csv

rows = [('Tom', 20, 170), ('Jerry', 25, 180), ('Mary', 30, 160)]

with open('data.csv', mode='a', newline='') as f:   # 设置mode参数为'a'追加模式
    writer = csv.writer(f)                            # 创建CSV写入器对象
    
    for row in rows:                                  # 遍历每行数据
        writer.writerow(row)                           # 将行数据写入CSV文件

3.1.4 JSON文件操作

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。它可以使用文本格式表示数据对象,也可以被转换成适合网络传输的其他格式,如XML。下面演示如何处理JSON文件。

首先安装json模块:

pip install json

这里假设有一个包含用户信息的json文件,内容如下:

{
  "users": [
    {
      "id": 1,
      "name": "Alice",
      "email": "alice@example.com"
    },
    {
      "id": 2,
      "name": "Bob",
      "email": "bob@example.com"
    }
  ]
}

方法一:读取JSON文件

使用json模块的loads()函数可以解析JSON字符串,并将其转换为字典。

import json

with open('data.json', 'r') as f:   # 打开JSON文件进行读取
    data = json.load(f)             # 解析JSON字符串并生成字典
    
    users = data['users']           # 获取用户列表
    
    for user in users:              
        id = user['id']             # 获取用户ID
        name = user['name']         # 获取用户名
        email = user['email']       # 获取邮箱地址
        
        print('{} ({}) - {}'.format(name, id, email))

方法二:写入JSON文件

使用json模块的dumps()函数可以将字典转换为JSON字符串,并写入文件。

import json

users = [{'id': 3, 'name': 'Charlie', 'email': 'charlie@example.com'}, {'id': 4, 'name': 'David', 'email': 'david@example.com'}]

with open('data.json', 'w') as f:   # 打开JSON文件进行写入
    data = {'users': users}          # 构造JSON字典数据结构
    
    json_str = json.dumps(data, indent=4)   # 将字典转化为JSON字符串
    f.write(json_str)                     # 写入JSON文件