10.1 文本文件读写


文档摘要

10.1 文本文件读写 第十章:NumPy 的文件输入输出 - 10.1 文本文件读写 NumPy 提供了多种方法来处理文件输入输出,其中文本文件读写是最基本且常用的功能之一。 本节将深入探讨 NumPy 如何读取和写入文本文件,以及相关函数的用法和注意事项。 :从文本文件读取数据 函数用于从文本文件加载数据到 NumPy 数组中。 它提供了灵活的参数来处理各种文本文件格式。 基本语法: 常用参数详解: :文件名或文件对象。 这是必需参数,指定要读取的文本文件。 :数据类型。 指定数组的数据类型。 默认为 。 :注释字符。 忽略以此字符开头的行。 默认为 。 :分隔符。 用于分隔文件中值的字符串。 如果为 ,则将连续的空格视为分隔符。 :字典。 将列号映射到转换函数的字典。

10.1 文本文件读写

第十章:NumPy 的文件输入输出 - 10.1 文本文件读写

NumPy 提供了多种方法来处理文件输入输出,其中文本文件读写是最基本且常用的功能之一。 本节将深入探讨 NumPy 如何读取和写入文本文件,以及相关函数的用法和注意事项。

1. numpy.loadtxt():从文本文件读取数据

numpy.loadtxt() 函数用于从文本文件加载数据到 NumPy 数组中。 它提供了灵活的参数来处理各种文本文件格式。

基本语法:

numpy.loadtxt(fname, dtype=float, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)

常用参数详解:

  • fname:文件名或文件对象。 这是必需参数,指定要读取的文本文件。

  • dtype:数据类型。 指定数组的数据类型。 默认为 float

  • comments:注释字符。 忽略以此字符开头的行。 默认为 #

  • delimiter:分隔符。 用于分隔文件中值的字符串。 如果为 None,则将连续的空格视为分隔符。

  • converters:字典。 将列号映射到转换函数的字典。 用于自定义数据转换。

  • skiprows:跳过的行数。 从文件开头跳过的行数。

  • usecols:使用的列。 指定要读取的列的序列。

  • unpack:是否解包。 如果为 True,则返回解包的数组。

  • ndmin:最小维度。 结果数组的最小维度。

  • encoding:编码方式。指定文件编码方式,例如 'utf-8'。

  • max_rows:读取的最大行数。

代码实践:

假设我们有一个名为 data.txt 的文件,内容如下:

# This is a sample data file 1, 2, 3 4, 5, 6 7, 8, 9

示例 1:基本读取

import numpy as np data = np.loadtxt('data.txt', delimiter=',', skiprows=1) # 跳过注释行 print(data) # 输出: # [[1. 2. 3.] # [4. 5. 6.] # [7. 8. 9.]]

示例 2:指定数据类型

data = np.loadtxt('data.txt', delimiter=',', skiprows=1, dtype=int) print(data) # 输出: # [[1 2 3] # [4 5 6] # [7 8 9]]

示例 3:使用 usecols

data = np.loadtxt('data.txt', delimiter=',', skiprows=1, usecols=(0, 2)) print(data) # 输出: # [[1. 3.] # [4. 6.] # [7. 9.]]

示例 4:自定义转换函数

假设 data.txt 文件内容如下:

Name,Age,Score Alice,25,85 Bob,30,92 Charlie,28,78

我们需要将 Age 列转换为 float 类型。

def age_converter(x): return float(x) converters = {1: age_converter} # 第2列(索引为1)使用 age_converter data = np.loadtxt('data.txt', delimiter=',', skiprows=1, converters=converters, dtype=object) print(data) # 输出: # [['Alice' '25.0' '85'] # ['Bob' '30.0' '92'] # ['Charlie' '28.0' '78']]

示例 5:处理缺失值

如果数据中存在缺失值,例如用 NA 表示,可以使用 converters 来处理。 假设 data.txt 文件内容如下:

1,2,3 4,NA,6 7,8,9
def missing_value_converter(x): try: return float(x) except ValueError: return np.nan # 使用 NumPy 的 NaN 表示缺失值 converters = {1: missing_value_converter} data = np.loadtxt('data.txt', delimiter=',', converters=converters) print(data) # 输出: # [[ 1. 2. 3.] # [ 4. nan 6.] # [ 7. 8. 9.]]

2. numpy.savetxt():将数组保存到文本文件

numpy.savetxt() 函数用于将 NumPy 数组保存到文本文件中。

基本语法:

numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None)

常用参数详解:

  • fname:文件名或文件对象。 指定要保存的文件。

  • X:要保存的数组。

  • fmt:格式字符串。 指定如何格式化每个元素。 默认为 '%.18e'(科学计数法)。

  • delimiter:分隔符。 用于分隔文件中值的字符串。 默认为 ' '(空格)。

  • newline:换行符。 用于分隔行的字符串。 默认为 '\n'

  • header:文件头。 写入文件开头的字符串。

  • footer:文件尾。 写入文件结尾的字符串。

  • comments:注释字符。 用于在 headerfooter 中添加注释。 默认为 '# '

  • encoding:编码方式。 指定文件编码方式,例如 'utf-8'。

代码实践:

import numpy as np data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 示例 1:基本保存 np.savetxt('output.txt', data, delimiter=',') # 示例 2:指定格式 np.savetxt('output_formatted.txt', data, delimiter=',', fmt='%d') # 整数格式 # 示例 3:添加文件头和文件尾 header = 'This is the header\nColumn1,Column2,Column3' footer = 'This is the footer' np.savetxt('output_header_footer.txt', data, delimiter=',', header=header, footer=footer, comments='# ')

生成的 output_header_footer.txt 文件内容如下:

# This is the header # Column1,Column2,Column3 1.000000000000000000e+00,2.000000000000000000e+00,3.000000000000000000e+00 4.000000000000000000e+00,5.000000000000000000e+00,6.000000000000000000e+00 7.000000000000000000e+00,8.000000000000000000e+00,9.000000000000000000e+00 # This is the footer

流程图:

3. numpy.genfromtxt():更灵活的文本文件读取

numpy.genfromtxt() 是一个更通用的函数,用于从文本文件加载数据,可以处理更复杂的情况,例如缺失值、不同数据类型等。 它在 loadtxt() 的基础上提供了更多的灵活性。

基本语法:

numpy.genfromtxt(fname, dtype=float, comments='#', delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None, names=None, excludelist=None, deletechars=None, replace_space='_', autostrip=False, case_sensitive=True, defaultfmt='f%i', unpack=None, usemask=False, loose=True, invalid_raise=True, max_rows=None, encoding='bytes')

常用参数详解(与 loadtxt() 不同的部分):

  • skip_header:跳过的头部行数。

  • skip_footer:跳过的尾部行数。

  • missing_values:用于标识缺失值的字符串或字符串序列。

  • filling_values:用于填充缺失值的值或值序列。

  • names:列名。 可以从文件中读取,也可以手动指定。

  • autostrip: 是否自动删除字符串首尾的空格。

代码实践:

假设 data_missing.txt 文件内容如下:

Name,Age,Score Alice,25,85 Bob,NA,92 Charlie,28,Missing
import numpy as np # 定义缺失值 missing_values = ['NA', 'Missing'] filling_values = {'Age': 0, 'Score': np.nan} # 年龄填充 0,分数填充 NaN data = np.genfromtxt('data_missing.txt', delimiter=',', skip_header=1, names=True, # 从第一行读取列名 missing_values=missing_values, filling_values=filling_values, dtype=None, encoding=None) # dtype=None 自动推断数据类型 print(data) # 输出: # [(b'Alice', 25, 85.) (b'Bob', 0, 92.) (b'Charlie', 28, nan)] print(data['Age']) #输出:[25 0 28]

在这个例子中,genfromtxt() 自动识别了 NAMissing 作为缺失值,并使用指定的 filling_values 进行了填充。 names=True 使得我们可以通过列名访问数据,例如 data['Age']

4. 总结

numpy.loadtxt()numpy.savetxt() 提供了基本的文本文件读写功能。 numpy.genfromtxt() 提供了更强大的功能,可以处理更复杂的文件格式和数据类型。 选择哪个函数取决于你的具体需求。 在处理文本文件时,需要仔细考虑分隔符、数据类型、缺失值等问题,并根据实际情况选择合适的参数。 掌握这些函数,可以方便地将数据从文本文件加载到 NumPy 数组中,并进行后续的分析和处理。

关键点:

  • loadtxt() 适合简单的、格式一致的文本文件。

  • savetxt() 用于将数组保存为文本文件,可以自定义格式。

  • genfromtxt() 适合更复杂的情况,例如缺失值、不同数据类型等。

通过本节的学习,你应该能够熟练地使用 NumPy 提供的函数进行文本文件的读写操作,并能够根据实际情况选择合适的函数和参数。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U