MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python利用文件内容进行操作

2022-07-071.4k 阅读

Python文件操作基础

打开与关闭文件

在Python中,使用open()函数来打开文件。该函数最基本的形式接受一个文件名作为参数,并返回一个文件对象。例如:

file = open('example.txt')

这里,example.txt是文件名。默认情况下,open()以只读模式打开文件。如果文件不存在,会抛出FileNotFoundError异常。

文件使用完毕后,应该使用close()方法关闭文件,以释放系统资源。例如:

file = open('example.txt')
# 对文件进行操作
file.close()

为了确保文件无论是否发生异常都会被正确关闭,可以使用with语句。with语句会在代码块结束时自动关闭文件。例如:

with open('example.txt') as file:
    # 对文件进行操作
    pass

文件打开模式

open()函数还可以接受第二个参数来指定文件的打开模式。常见的模式有:

  • 只读模式('r':默认模式,只能读取文件内容。如果文件不存在,会抛出FileNotFoundError异常。
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
  • 写入模式('w':打开文件进行写入。如果文件已存在,会清空文件内容;如果文件不存在,会创建新文件。
with open('new_file.txt', 'w') as file:
    file.write('This is some new content.')
  • 追加模式('a':打开文件进行追加写入。如果文件不存在,会创建新文件。新写入的内容会追加到文件末尾。
with open('existing_file.txt', 'a') as file:
    file.write('\nThis is appended content.')
  • 二进制模式:可以在上述模式后加上'b',如'rb'(二进制只读)、'wb'(二进制写入)。常用于处理非文本文件,如图像、音频等。例如,读取二进制文件:
with open('image.jpg', 'rb') as file:
    binary_data = file.read()

读取文件内容

读取整个文件

使用文件对象的read()方法可以读取文件的全部内容,并返回一个字符串(对于文本文件)或字节对象(对于二进制文件)。例如:

with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

这种方式适用于文件较小的情况。如果文件非常大,一次性读取可能会导致内存问题。

逐行读取

逐行读取文件内容可以避免一次性加载大量数据到内存。可以使用readline()方法每次读取一行。例如:

with open('example.txt', 'r') as file:
    line = file.readline()
    while line:
        print(line.strip())  # strip()方法用于去除每行末尾的换行符
        line = file.readline()

也可以使用for循环来逐行迭代文件对象,这种方式更加简洁:

with open('example.txt', 'r') as file:
    for line in file:
        print(line.strip())

读取指定数量的字符或字节

read()方法可以接受一个参数,表示读取的字符(对于文本文件)或字节(对于二进制文件)数量。例如,读取文件的前10个字符:

with open('example.txt', 'r') as file:
    partial_content = file.read(10)
    print(partial_content)

写入文件内容

写入字符串

使用文件对象的write()方法可以将字符串写入文件。在写入模式('w')或追加模式('a')下有效。例如:

with open('output.txt', 'w') as file:
    file.write('This is some text to write.')

如果需要写入多行,可以使用\n来表示换行,或者使用writelines()方法。writelines()方法接受一个字符串序列(如列表),并将每个字符串写入文件,不会自动添加换行符。例如:

lines = ['Line 1\n', 'Line 2\n', 'Line 3\n']
with open('output.txt', 'w') as file:
    file.writelines(lines)

写入二进制数据

对于二进制文件,使用write()方法写入字节对象。例如,将二进制数据写入文件:

binary_data = b'\x48\x65\x6c\x6c\x6f'  # 字节对象
with open('binary_file.bin', 'wb') as file:
    file.write(binary_data)

文件指针操作

获取和移动文件指针

文件对象有一个内部的文件指针,指示当前读取或写入的位置。可以使用tell()方法获取文件指针的当前位置(从文件开头开始计数的字节数,对于文本文件,可能不太直观,因为换行符的处理等因素)。例如:

with open('example.txt', 'r') as file:
    file.read(5)  # 读取前5个字符
    position = file.tell()
    print(f"当前文件指针位置: {position}")

使用seek()方法可以移动文件指针到指定位置。seek()方法接受两个参数:偏移量(offset)和起始位置(whence)。起始位置有以下几种取值:

  • 0:表示从文件开头开始计算偏移量(默认值)。例如,将文件指针移动到文件开头:
with open('example.txt', 'r') as file:
    file.seek(0)
  • 1:表示从当前位置开始计算偏移量。例如,从当前位置向后移动10个字节:
with open('example.txt', 'r') as file:
    file.seek(10, 1)
  • 2:表示从文件末尾开始计算偏移量。例如,移动到文件末尾前5个字节的位置:
with open('example.txt', 'r') as file:
    file.seek(-5, 2)

在文件中间插入内容

要在文件中间插入内容,一般不能直接在原文件中插入,因为文件系统的结构不支持这种操作。常见的做法是将文件内容读取到内存,修改内存中的数据,然后再将修改后的数据写回文件。例如,假设要在文件的第10个字符后插入新内容:

with open('example.txt', 'r') as file:
    content = file.read()
new_content = content[:10] + 'Inserted text' + content[10:]
with open('example.txt', 'w') as file:
    file.write(new_content)

文件与目录操作的综合应用

遍历目录

Python的os模块提供了遍历目录的功能。例如,使用os.walk()函数可以递归地遍历目录树。以下是一个示例,列出指定目录及其子目录下的所有文件:

import os

def list_files(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            print(os.path.join(root, file))

list_files('.')  # 遍历当前目录

在上述代码中,os.walk()返回一个三元组:当前目录路径(root)、当前目录下的子目录列表(dirs)和当前目录下的文件列表(files)。

创建与删除文件和目录

使用os模块还可以创建和删除文件与目录。例如,使用os.makedirs()函数可以创建多级目录:

import os

os.makedirs('new_directory/sub_directory', exist_ok=True)

这里,exist_ok=True表示如果目录已经存在,不会抛出异常。

删除文件可以使用os.remove()函数,删除目录可以使用os.rmdir()函数(只能删除空目录)。如果要删除非空目录及其所有内容,可以使用shutil.rmtree()函数。例如:

import os
import shutil

# 删除文件
os.remove('file_to_delete.txt')
# 删除空目录
os.rmdir('empty_directory')
# 删除非空目录
shutil.rmtree('non_empty_directory')

重命名文件和目录

使用os.rename()函数可以重命名文件或目录。例如:

import os

os.rename('old_file.txt', 'new_file.txt')
os.rename('old_directory', 'new_directory')

文件内容的高级操作

搜索文件中的文本

要在文件中搜索特定的文本,可以逐行读取文件内容,并使用字符串的方法来查找匹配项。例如,查找文件中包含特定单词的行:

search_word = 'example'
with open('example.txt', 'r') as file:
    for line in file:
        if search_word in line:
            print(line.strip())

如果需要更复杂的文本搜索,比如使用正则表达式,可以使用re模块。例如,查找符合特定正则表达式的行:

import re

pattern = re.compile(r'\d{3}-\d{2}-\d{4}')  # 匹配格式为XXX-XX-XXXX的字符串
with open('example.txt', 'r') as file:
    for line in file:
        if pattern.search(line):
            print(line.strip())

替换文件中的文本

替换文件中的文本与在文件中间插入内容类似,通常需要先读取文件内容,进行替换操作,然后再写回文件。例如,将文件中的某个单词替换为另一个单词:

replace_word = 'old_word'
new_word = 'new_word'
with open('example.txt', 'r') as file:
    content = file.read()
new_content = content.replace(replace_word, new_word)
with open('example.txt', 'w') as file:
    file.write(new_content)

如果使用正则表达式进行替换,可以使用re.sub()函数。例如,替换符合特定正则表达式的字符串:

import re

pattern = re.compile(r'\d{3}-\d{2}-\d{4}')
replacement = 'XXX-XX-XXXX'
with open('example.txt', 'r') as file:
    content = file.read()
new_content = pattern.sub(replacement, content)
with open('example.txt', 'w') as file:
    file.write(new_content)

处理大文件

处理大文件时,为了避免内存占用过高,应该采用逐块读取和处理的方式。例如,假设要处理一个非常大的文本文件,统计其中单词的出现次数:

word_count = {}
chunk_size = 1024 * 1024  # 每次读取1MB
with open('large_file.txt', 'r') as file:
    while True:
        chunk = file.read(chunk_size)
        if not chunk:
            break
        words = chunk.split()
        for word in words:
            if word in word_count:
                word_count[word] += 1
            else:
                word_count[word] = 1
print(word_count)

在上述代码中,每次读取固定大小的文件块,对块内的单词进行统计,从而避免一次性加载整个大文件到内存。

文件加密与解密

文件加密与解密是保护文件内容安全的重要手段。可以使用第三方库,如cryptography来实现文件的加密和解密。以下是一个简单的示例,使用AES(高级加密标准)算法对文件进行加密和解密:

from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# 加密文件
with open('plaintext.txt', 'rb') as file:
    plaintext = file.read()
ciphertext = cipher_suite.encrypt(plaintext)
with open('encrypted.txt', 'wb') as file:
    file.write(ciphertext)

# 解密文件
with open('encrypted.txt', 'rb') as file:
    ciphertext = file.read()
decrypted_text = cipher_suite.decrypt(ciphertext)
with open('decrypted.txt', 'wb') as file:
    file.write(decrypted_text)

在上述代码中,首先生成一个密钥,然后使用该密钥对文件进行加密,将加密后的内容写入新文件。之后,使用相同的密钥对加密文件进行解密,并将解密后的内容写入另一个文件。

文件压缩与解压缩

Python的zipfile模块用于处理ZIP格式的压缩文件,tarfile模块用于处理TAR格式的压缩文件。以下是使用zipfile模块压缩文件的示例:

import zipfile

with zipfile.ZipFile('archive.zip', 'w') as zipf:
    zipf.write('file1.txt')
    zipf.write('file2.txt')

上述代码将file1.txtfile2.txt压缩到archive.zip文件中。

解压缩ZIP文件的示例如下:

import zipfile

with zipfile.ZipFile('archive.zip', 'r') as zipf:
    zipf.extractall('extracted_files')

这里将archive.zip文件解压到extracted_files目录中。

使用tarfile模块压缩文件的示例:

import tarfile

with tarfile.open('archive.tar.gz', 'w:gz') as tarf:
    tarf.add('file1.txt')
    tarf.add('file2.txt')

上述代码将file1.txtfile2.txt压缩到archive.tar.gz文件中(使用gzip压缩)。

解压缩TAR文件的示例如下:

import tarfile

with tarfile.open('archive.tar.gz', 'r:gz') as tarf:
    tarf.extractall('extracted_files')

这里将archive.tar.gz文件解压到extracted_files目录中。

通过以上对Python文件操作的详细介绍,从基础的文件打开、读取、写入,到文件指针操作,再到文件与目录操作的综合应用以及文件内容的高级操作,涵盖了Python在文件处理方面的众多知识点。希望这些内容能帮助开发者更好地利用文件内容进行各种操作,满足不同场景下的需求。