import os import glob import pandas as pd import numpy as np import torch import torch.nn as nn import torch.optim as optim import random import matplotlib.pyplot as plt # 設定 matplotlib 以支援中文(若系統有中文字型,請根據實際狀況修改) plt.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei'] plt.rcParams['axes.unicode_minus'] = False # ============================================================================= # (A) 從 station_data 檔案讀取資料 # ============================================================================= def load_station_data(folder_path): """ 從指定資料夾中讀取檔名符合 station_data_out_20250313_*.txt 的檔案, 並解析每行資料,整理成符合模型需求的 DataFrame。 每行範例: ba:92:7a:b0:b7:50 -71 39.0 MBit/s 24.0 MBit/s 10 0 256 17.211Mbps 145356 將轉換成以下欄位 (依模型需求): - channel:預設填入 0(環境 reset 時會重新分配) - total_throughput:從 throughput 欄位取得(去掉 "Mbps") - pdr:這裡暫用 parts[6](例如 10) - snr:這裡暫用接收速率 parts[4](例如 24.0) - rssi:直接取 signal 值 (parts[1]) - noise:取 parts[7](例如 0) """ pattern = os.path.join(folder_path, "station_data_out_20250313_*.txt") files = glob.glob(pattern) data = [] for file in files: with open(file, "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue parts = line.split() if len(parts) != 11: # 欄位數不正確時略過此行 continue try: mac = parts[0] signal = int(parts[1]) # throughput 從 parts[9] 去除 "Mbps" throughput = float(parts[9].rstrip("Mbps")) channel = 0 # 初始值,reset 時會重新分配 AP pdr = float(parts[6]) snr = float(parts[4]) rssi = signal noise = float(parts[7]) except Exception as e: print(f"解析錯誤: {line}\n{e}") contin
时间: 2025-03-14 07:10:18 浏览: 69
<think>好的,我现在需要解决用户的问题:如何编写一个Python函数来读取符合特定文件模式(station_data_out_20250313_*.txt)的多个文本文件,并将它们解析到Pandas DataFrame中。首先,我需要回顾一下用户提供的引用内容,看看是否有相关的信息可以利用。
根据引用[1],读函数使用pd.read_xxx,而写函数是DataFrame.to_xxx。用户的问题是关于读取文件,所以应该使用pandas的read函数。引用[3]提到使用read_csv()读取CSV文件,但用户需要处理的是.txt文件,可能需要确认文件的分隔符是否与CSV类似,比如是否是逗号或制表符分隔。另外,引用[4]给出了一个例子df = pd.read_csv(...),说明即使用于txt文件,只要格式合适,也可以用read_csv来处理,因为txt文件可能是以某种分隔符分隔的文本,类似CSV。
接下来,用户需要处理文件名模式station_data_out_20250313_*.txt,这里的*是通配符,可能代表多个文件,比如不同时间或编号的数据。因此,函数需要能够批量读取符合这个模式的所有文件,并将它们合并到一个DataFrame中。
首先,我需要确定如何批量读取多个文件。可以使用glob模块来查找所有匹配的文件名,然后用循环逐个读取并合并。例如,使用glob.glob('station_data_out_20250313_*.txt')获取所有匹配的文件列表。
然后,每个文件的格式需要确定。假设这些txt文件的结构一致,比如列之间用制表符或空格分隔,或者有固定的列宽。但通常,如果数据是结构化的,可能会使用逗号或制表符分隔。例如,如果文件是用制表符分隔的,read_csv的参数应该是sep='\t'。如果文件没有标题行,可能需要设置header=None,并通过names参数指定列名,如引用[3]中提到的。
此外,引用[4]中的例子使用了na_values参数来处理缺失值,用户可能需要处理数据中的缺失值,比如将特定的字符串(如'missing')识别为NaN。所以在读取文件时,可能需要设置na_values参数。
接下来,每个文件读取后,可能需要添加一列来标识数据来源的文件名,方便后续追踪。可以使用pd.concat()将多个DataFrame合并,并且在每个DataFrame中添加一个源文件的列。
然后,处理可能的编码问题。如果txt文件使用的是非UTF-8编码,比如GBK,可能需要指定encoding参数。但用户没有提到具体编码,可能默认使用UTF-8即可,或者需要作为参数让函数更灵活。
最后,将这些步骤整合成一个函数,接受文件路径模式、分隔符等参数,返回合并后的DataFrame。
可能需要注意的问题包括:文件是否存在、读取时如何处理不同的分隔符、列名是否需要统一、内存是否足够处理大文件等。但根据用户的问题,可能假设文件结构一致且大小适中。
现在,综合以上思路,函数的步骤可能是:
1. 使用glob找到所有匹配的文件。
2. 逐个读取每个文件到DataFrame,使用正确的分隔符和处理缺失值。
3. 添加文件名作为新列。
4. 合并所有DataFrame。
5. 返回合并后的结果。
需要测试这个流程是否可行,并确保参数设置正确,比如sep、header、names、na_values等。另外,如果文件有标题行,应设置header=0;如果没有,可能需要手动指定列名。</think>根据文件命名特征和Pandas数据读取规范,可通过以下步骤实现结构化数据加载:
### 一、基础文件读取函数
```python
import pandas as pd
import glob
def load_station_data(file_pattern):
"""
读取匹配指定模式的所有文本文件到DataFrame
参数:
file_pattern: 文件路径模式,如"station_data_out_20250313_*.txt"
返回:
合并后的DataFrame对象
"""
# 获取所有匹配的文件路径
file_paths = glob.glob(file_pattern)
# 初始化数据容器
dfs = []
# 批量读取文件
for file in file_paths:
# 使用read_csv读取文本文件(假设制表符分隔)
df = pd.read_csv(
file,
sep='\t', # 假设字段用制表符分隔
header=0, # 假设首行为列标题
na_values=['NA', 'null', 'missing'], # 自定义缺失值标识[^4]
parse_dates=['timestamp'] # 假设有时间戳字段需要转换
)
# 添加来源标识
df['source_file'] = file.split('/')[-1]
dfs.append(df)
# 合并数据集
return pd.concat(dfs, ignore_index=True)
```
### 二、函数增强建议
1. **异常处理增强版**:
```python
try:
df = pd.read_csv(...)
except pd.errors.ParserError as e:
print(f"解析错误:{e},文件:{file}")
continue
```
2. **大文件分块读取**:
```python
# 使用迭代器分块读取
reader = pd.read_csv(..., chunksize=10000)
for chunk in reader:
process(chunk)
```
### 三、关键参数说明
| 参数 | 说明 | 示例 |
|------|------|------|
| `sep` | 列分隔符 | `\t`(制表符)、`,`(逗号) |
| `na_values` | 缺失值标识 | `['N/A', 'null']` |
| `dtype` | 列类型指定 | `{'id': 'str', 'value': 'float32'}` |
| `parse_dates` | 日期解析列 | `['record_date']` |
| `encoding` | 文件编码 | `'utf-8'`、`'gbk'` |
### 四、验证使用示例
```python
# 调用函数加载数据
combined_df = load_station_data('data/station_data_out_20250313_*.txt')
# 显示数据结构
print(combined_df.info())
# 检查基础统计量
print(combined_df.describe())
```
### 五、性能优化建议
1. **类型转换**:读取时指定`dtype`参数减少内存占用
2. **选择性加载**:使用`usecols`参数加载必需字段
3. **并行处理**:使用`concurrent.futures`实现多线程读取[^1]
阅读全文
相关推荐


















