Python读取CSV文件:提取特定字符串`s,s,N,s`之后的数据
解决方案:提取CSV中特定字符串后的四列数值数据
你的现有代码存在几个问题:直接引用row但未遍历行数据,且Pandas读入的DataFrame不能直接这样判断行内容。以下是两种可行的实现方案,分别基于Pandas和纯Python,你可以根据需求选择:
方案一:使用Pandas实现(适合处理结构化数据)
import pandas as pd # 读取CSV,不将第一行设为表头,保留所有行的原始结构 df = pd.read_csv( r'C:\Users\User\Documents\pythonProject\filename.csv', engine="python", sep=',', encoding='latin-1', header=None ) # 定位以's,s,N,s'开头的行 target_rows = df[df[0].str.startswith('s,s,N,s', na=False)] if not target_rows.empty: target_idx = target_rows.index[0] # 情况1:提取目标行中`s,s,N,s`之后的四列数值(即该行的第2-5列) current_row_data = target_rows.iloc[0][1:5].apply(pd.to_numeric, errors='coerce').dropna() print("目标行内的四列数值:") print(current_row_data) # 情况2:提取目标行之后所有行的前四列数值 if target_idx + 1 < len(df): subsequent_data = df.loc[target_idx+1:, 0:4].apply(pd.to_numeric, errors='coerce').dropna(how='all') print("\n目标行之后的四列数值:") print(subsequent_data) else: print("未找到包含's,s,N,s'的行")
代码说明
header=None:避免Pandas自动将第一行识别为表头,确保所有行都作为数据行处理df[0].str.startswith(...):检查每行第一列是否以目标字符串开头,na=False跳过空值行pd.to_numeric:将提取的列转为数值类型,errors='coerce'将无效值转为NaN,dropna过滤无效数据
方案二:纯Python实现(逐行处理,适合新手理解)
import csv file_path = r'C:\Users\User\Documents\pythonProject\filename.csv' target_data = [] found_target = False with open(file_path, 'r', encoding='latin-1') as csv_file: reader = csv.reader(csv_file) for row in reader: # 找到目标行后,开始收集后续行的四列数值 if found_target: try: # 提取前四列并转为浮点数,跳过空值 numeric_cols = [float(col.strip()) for col in row[:4] if col.strip()] if numeric_cols: target_data.append(numeric_cols) except ValueError: # 跳过无法转为数值的行 continue # 检查当前行是否包含目标字符串 if row and row[0].startswith('s,s,N,s'): found_target = True # 若需要提取目标行本身的后续四列,取消以下注释 # try: # numeric_cols = [float(col.strip()) for col in row[1:5] if col.strip()] # target_data.append(numeric_cols) # except ValueError: # pass print("提取的数值数据:") for item in target_data: print(item)
代码说明
- 用
csv.reader逐行读取文件,无需依赖Pandas - 通过
found_target标记控制数据收集的起始点 try-except捕获数值转换错误,避免程序崩溃
内容的提问来源于stack exchange,提问作者JetskiS
相关产品推荐
相关产品推荐

