Python 读取数据列:从入门到精通,高效提取与处理指南191
在数据驱动的时代,数据已成为各个领域的核心。无论是进行数据分析、机器学习预处理,还是生成业务报告,我们都离不开对数据的读取、筛选和处理。Python 以其强大的数据处理库生态,成为处理这些任务的首选工具。本文将深入探讨 Python 如何高效、灵活地读取数据列,涵盖从基础文件操作到高级库使用的各种方法,帮助您从入门到精通。
一、为什么高效读取数据列至关重要?
数据通常以行和列的形式组织。在实际工作中,我们往往不需要读取整个数据集,而只需要关注其中的特定列。例如:
在一个包含用户交易记录的 CSV 文件中,我们可能只关心“交易金额”、“商品类别”和“交易时间”,而忽略“用户 ID”、“订单号”等。
在进行特征工程时,我们可能需要从原始数据中提取出作为模型输入的特征列。
处理海量数据时,只加载所需列可以显著减少内存占用,提高处理速度。
因此,掌握高效读取数据列的方法,是每个数据工作者的必备技能。
二、Python 读取数据列的基础方法
Python 提供了多种读取数据列的方式,具体取决于数据的格式和您的需求。
2.1 使用标准库 `csv` 模块处理 CSV 文件
对于结构化的 CSV (Comma Separated Values) 文件,Python 内置的 `csv` 模块是直接且有效的选择。它特别适用于不需要复杂数据结构(如 DataFrame)但需要逐行处理的情况。
示例文件:``
Name,Age,City,Occupation
Alice,30,New York,Engineer
Bob,24,London,Designer
Charlie,35,Paris,Doctor
David,29,Berlin,Engineer
方法一:按索引读取
如果我们知道所需列的顺序,可以通过列的索引来获取数据。例如,要读取“Name”和“City”列,它们分别位于索引 0 和 2。import csv
def read_specific_columns_by_index(filepath, column_indices):
column_data = {index: [] for index in column_indices}
with open(filepath, 'r', encoding='utf-8') as file:
reader = (file)
header = next(reader) # 跳过标题行
print(f"Header: {header}") # 打印标题以供参考
for row in reader:
if not row: # 跳过空行
continue
for index in column_indices:
if index < len(row):
column_data[index].append(row[index])
return column_data
filepath = ''
# 假设我们想读取 Name (索引 0) 和 City (索引 2)
desired_indices = [0, 2]
extracted_data = read_specific_columns_by_index(filepath, desired_indices)
print("按索引提取的数据:")
for index, data_list in ():
# 为了更好地展示,我们可以根据索引找回列名(如果需要)
with open(filepath, 'r', encoding='utf-8') as file:
reader = (file)
header = next(reader)
col_name = header[index] if index < len(header) else f"Column_{index}"
print(f"{col_name}: {data_list}")
方法二:使用 `` 按名称读取
`DictReader` 会将每一行数据读取为一个字典,其中键是标题行中的列名。这使得我们可以通过列名而不是索引来访问数据,代码更具可读性和健壮性。import csv
def read_specific_columns_by_name(filepath, column_names):
column_data = {name: [] for name in column_names}
with open(filepath, 'r', encoding='utf-8') as file:
reader = (file)
# 检查所需列名是否存在于文件标题中
for col_name in column_names:
if col_name not in :
print(f"Warning: Column '{col_name}' not found in file header.")
# 可以选择从 column_data 中移除此列,或跳过后续处理
(col_name)
for row in reader:
for name in column_names:
if name in row: # 确保列名在当前行中存在
column_data[name].append(row[name])
return column_data
filepath = ''
# 假设我们想读取 'Name' 和 'Occupation' 列
desired_names = ['Name', 'Occupation']
extracted_data_by_name = read_specific_columns_by_name(filepath, desired_names)
print("按名称提取的数据:")
for name, data_list in ():
print(f"{name}: {data_list}")
`DictReader` 的优势在于其自文档性,即使列的顺序发生变化,代码也不需要修改。
2.2 使用 `open()` 函数处理普通文本文件
对于非 CSV 格式的普通文本文件(如以空格、制表符或其他自定义分隔符分隔的文件),我们可以使用 Python 内置的 `open()` 函数结合字符串操作来读取数据列。
示例文件:``
ID Product Price
1001 Laptop 1200.50
1002 Mouse 25.99
1003 Keyboard 75.00
读取指定列
def read_txt_columns(filepath, column_positions, delimiter=None):
column_data = {pos: [] for pos in column_positions}
with open(filepath, 'r', encoding='utf-8') as file:
header_line = next(file).strip() # 读取标题行
header_cols = (delimiter) if delimiter else ()
print(f"Header: {header_cols}")
for line in file:
line = ()
if not line:
continue
parts = (delimiter) if delimiter else ()
for pos in column_positions:
if pos < len(parts):
column_data[pos].append(parts[pos])
return column_data
filepath_txt = ''
# 假设我们想读取 Product (索引 1) 和 Price (索引 2)
desired_positions = [1, 2]
extracted_txt_data = read_txt_columns(filepath_txt, desired_positions)
print("从 TXT 文件按索引提取的数据:")
for pos, data_list in ():
# 同样,为了更好地展示,从标题行找回列名
with open(filepath_txt, 'r', encoding='utf-8') as file:
header_line = next(file).strip()
header_cols = ()
col_name = header_cols[pos] if pos < len(header_cols) else f"Column_{pos}"
print(f"{col_name}: {data_list}")
这种方法灵活性高,但需要手动处理分隔符、类型转换等,代码量相对较大。
三、使用 `pandas` 库:数据列读取的利器
`pandas` 是 Python 最流行的数据处理库,其核心数据结构 `DataFrame` 使得读取、操作和分析表格数据变得异常简单和高效。对于任何严肃的数据工作,`pandas` 几乎是必选项。
首先,确保您已安装 `pandas`:pip install pandas
3.1 读取 CSV 文件并选择列
1. 读取所有列,然后选择
这是最常见的方式:先读取整个 CSV 文件到 DataFrame,然后使用各种方法选择所需列。import pandas as pd
filepath = ''
df = pd.read_csv(filepath)
print("原始 DataFrame:")
print(df)
# 方法一:通过列名列表选择多列 (返回 DataFrame)
selected_columns_df = df[['Name', 'City']]
print("选择 'Name' 和 'City' 列 (DataFrame):")
print(selected_columns_df)
# 方法二:通过单个列名选择单列 (返回 Series)
name_series = df['Name']
print("选择 'Name' 列 (Series):")
print(name_series)
# 方法三:使用 .loc[] 按标签选择行和列
# 选择所有行,'Name' 和 'City' 列
selected_loc_df = [:, ['Name', 'City']]
print("使用 .loc[] 选择 'Name' 和 'City' 列:")
print(selected_loc_df)
# 方法四:使用 .iloc[] 按位置选择行和列 (0-indexed)
# 假设 'Name' 在索引 0, 'City' 在索引 2
selected_iloc_df = [:, [0, 2]]
print("使用 .iloc[] 选择索引 0 和 2 的列:")
print(selected_iloc_df)
2. 读取时直接指定所需列 (`usecols` 参数)
当文件很大,而您只关心少数几列时,`usecols` 参数可以帮助 `pandas` 在加载时只读取这些列,从而大大减少内存占用和加载时间。import pandas as pd
filepath = ''
# 使用 usecols 参数直接指定要读取的列名
df_specific = pd.read_csv(filepath, usecols=['Name', 'Occupation'])
print("使用 usecols 参数直接读取 'Name' 和 'Occupation' 列:")
print(df_specific)
# usecols 也可以接受列的索引列表
# df_specific_by_index = pd.read_csv(filepath, usecols=[0, 3])
# print("使用 usecols 参数直接读取索引 0 和 3 的列:")
# print(df_specific_by_index)
3.2 读取 Excel 文件并选择列
`pandas` 处理 Excel 文件(`.xls`, `.xlsx`)同样强大。
首先,确保您已安装 `openpyxl`(处理 `.xlsx`)或 `xlrd`(处理 `.xls`):
pip install openpyxl xlrd
示例文件:``
内容与 `` 相同。import pandas as pd
filepath_excel = ''
# 读取 Excel 文件,默认读取第一个工作表
df_excel = pd.read_excel(filepath_excel)
print("原始 Excel DataFrame:")
print(df_excel)
# 选择特定列 (与 CSV 方式相同)
selected_excel_columns = df_excel[['Name', 'Age']]
print("从 Excel 选择 'Name' 和 'Age' 列:")
print(selected_excel_columns)
# 读取时指定工作表和列
# 假设 Excel 文件中有多个 Sheet,我们要读取 'Sheet1' 并指定列
df_excel_specific = pd.read_excel(filepath_excel, sheet_name='Sheet1', usecols=['Name', 'City'])
print("从 Excel 'Sheet1' 读取 'Name' 和 'City' 列:")
print(df_excel_specific)
3.3 读取 JSON 文件并选择列
JSON (JavaScript Object Notation) 是一种常用的数据交换格式。`pandas` 也能很好地处理 JSON。
示例文件:``
[{
"Name": "Alice",
"Age": 30,
"City": "New York",
"Occupation": "Engineer"
}, {
"Name": "Bob",
"Age": 24,
"City": "London",
"Occupation": "Designer"
}, {
"Name": "Charlie",
"Age": 35,
"City": "Paris",
"Occupation": "Doctor"
}]
import pandas as pd
filepath_json = ''
# 读取 JSON 文件
df_json = pd.read_json(filepath_json)
print("原始 JSON DataFrame:")
print(df_json)
# 选择特定列
selected_json_columns = df_json[['Name', 'Occupation']]
print("从 JSON 选择 'Name' 和 'Occupation' 列:")
print(selected_json_columns)
需要注意的是,`pd.read_json()` 假定 JSON 结构能够被扁平化为表格形式。对于更复杂的嵌套 JSON,可能需要先用 `json` 模块加载,然后手动解析,或使用 `pd.json_normalize()`。
四、从数据库中读取数据列
Python 可以通过各种数据库连接器(如 `sqlite3`, `psycopg2`, `pymysql` 等)与数据库交互。`pandas` 的 `read_sql_query` 函数极大地简化了从 SQL 数据库读取数据的过程。
以 SQLite 为例:import pandas as pd
import sqlite3
# 1. 创建一个内存数据库并插入一些数据作为示例
conn = (':memory:')
cursor = ()
('''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER,
city TEXT,
occupation TEXT
)
''')
users_data = [
(1, 'Alice', 30, 'New York', 'Engineer'),
(2, 'Bob', 24, 'London', 'Designer'),
(3, 'Charlie', 35, 'Paris', 'Doctor')
]
("INSERT INTO users VALUES (?,?,?,?,?)", users_data)
()
# 2. 使用 pandas.read_sql_query 从数据库中读取指定列
query = "SELECT name, city, occupation FROM users WHERE age > 25"
df_db = pd.read_sql_query(query, conn)
print("从 SQLite 数据库读取指定列:")
print(df_db)
# 关闭数据库连接
()
通过 `read_sql_query`,我们可以直接在 SQL 查询中指定所需列 (`SELECT name, city, occupation ...`),数据库在返回结果时就已完成了列的筛选,这对于处理大型数据库非常高效。
五、高级技巧与最佳实践
5.1 处理大型文件:分块读取 (`chunksize`)
当数据文件非常大(GB 级别)以至于无法一次性加载到内存时,`pandas` 的 `read_csv` 和 `read_excel` 提供了 `chunksize` 参数,允许您分块读取文件,逐块处理。import pandas as pd
filepath = '' # 假设这是一个非常大的文件
# 创建一个稍大的测试文件
with open(filepath, 'w', encoding='utf-8') as f:
("Name,Age,City,Occupation")
for i in range(100000): # 10万行数据
(f"User{i},{20 + i%50},City{i%100},Job{i%20}")
# 分块读取,并只选择 'Name' 和 'City' 列
for chunk_df in pd.read_csv(filepath, chunksize=10000, usecols=['Name', 'City']):
print(f"处理数据块 (行数: {len(chunk_df)}):")
print(())
# 在这里可以对每个 chunk_df 进行处理,例如聚合、筛选等
# ...
这种方式非常适用于流式处理大型数据集,避免内存溢出。
5.2 错误处理和数据清洗
在实际数据中,数据列可能存在缺失值、类型错误或格式不一致的情况。`pandas` 提供了丰富的工具进行数据清洗。
`(subset=['ColumnName'])`: 删除指定列中包含缺失值的行。
`df['ColumnName'].fillna(value)`: 填充指定列的缺失值。
`df['ColumnName'].astype(type)`: 转换列的数据类型。
`pd.to_numeric()`, `pd.to_datetime()`: 专门用于数字和日期时间类型转换,并可处理错误。
import pandas as pd
import numpy as np
# 创建一个包含缺失值和不规范数据的 DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'Age': [30, 24, , 29, 'Unknown'], # 包含 NaN 和字符串
'City': ['New York', 'London', 'Paris', 'Berlin', ],
'Score': [85, 92, 78, 95, 'N/A'] # 包含字符串
}
df_dirty = (data)
print("原始 DataFrame (可能包含脏数据):")
print(df_dirty)
# 1. 尝试将 'Age' 列转换为数值类型,并处理错误
df_dirty['Age'] = pd.to_numeric(df_dirty['Age'], errors='coerce') # 'coerce' 会将无法转换的值变为 NaN
print("转换 'Age' 列为数值类型后:")
print(df_dirty)
# 2. 填充 'City' 列的缺失值
df_dirty['City'].fillna('Unknown', inplace=True)
print("填充 'City' 列缺失值后:")
print(df_dirty)
# 3. 转换 'Score' 列为数值类型,并处理缺失值
df_dirty['Score'] = pd.to_numeric(df_dirty['Score'], errors='coerce')
df_dirty['Score'].fillna(df_dirty['Score'].mean(), inplace=True) # 用平均值填充
print("处理 'Score' 列后:")
print(df_dirty)
# 4. 删除 'Name' 列中缺失值的行 (这里没有缺失值,仅作示例)
# df_clean = (subset=['Name'])
# print("删除 'Name' 列缺失值行后:")
# print(df_clean)
5.3 重命名列
在读取数据后,有时列名可能不符合我们的编程习惯或具有歧义,可以使用 `()` 进行重命名。import pandas as pd
df = pd.read_csv('')
print("原始 DataFrame 列名:")
print()
# 重命名 'Occupation' 列为 'JobTitle'
(columns={'Occupation': 'JobTitle'}, inplace=True)
print("重命名 'Occupation' 列为 'JobTitle' 后:")
print()
print(())
六、总结与选择
本文详细介绍了 Python 读取数据列的多种方法,从基础的 `csv` 模块和 `open()` 函数到功能强大的 `pandas` 库,再到数据库集成。
`csv` 模块和 `open()` 函数:适用于简单、小规模的文本文件,或者需要极致内存控制和自定义解析逻辑的场景。它们提供了更底层的控制。
`pandas` 库:对于绝大多数数据处理任务而言,`pandas` 是首选。它提供了 `DataFrame` 这一高效且易用的数据结构,支持多种文件格式(CSV, Excel, JSON, SQL 等),拥有丰富的列选择、过滤、清洗和转换功能。特别是其 `usecols` 参数在处理大型文件时能显著提升效率。
掌握这些技术,您将能够灵活高效地从各种数据源中提取和处理所需的数据列,为后续的数据分析和应用奠定坚实基础。在实际工作中,建议优先考虑使用 `pandas`,它能让您的数据处理工作事半功倍。
2025-09-30

Python字符串转列表:从基础到高级,掌握多种高效技巧与实战应用
https://www.shuihudhg.cn/128007.html

PHP 文件流深度解析:从基础到高级的高效读取与处理实践
https://www.shuihudhg.cn/128006.html

C语言字符串截取:深入理解与实现自定义`left`函数
https://www.shuihudhg.cn/128005.html

Python字符串前缀检查利器:startswith() 方法深度解析与高效应用实践
https://www.shuihudhg.cn/128004.html

掌握Python `random` 模块:随机数生成与灵活函数调用技巧
https://www.shuihudhg.cn/128003.html
热门文章

Python 格式化字符串
https://www.shuihudhg.cn/1272.html

Python 函数库:强大的工具箱,提升编程效率
https://www.shuihudhg.cn/3366.html

Python向CSV文件写入数据
https://www.shuihudhg.cn/372.html

Python 静态代码分析:提升代码质量的利器
https://www.shuihudhg.cn/4753.html

Python 文件名命名规范:最佳实践
https://www.shuihudhg.cn/5836.html