如何提取CSV每行末尾数值及数组行的最后元素?
解决CSV数据提取的两个问题
先指出你原代码里的核心问题:
- 你的CSV实际是制表符/多空格分隔,但你设置了
delimiter=',',导致每行被当成单个字符串存入列表,这是后续提取失败的关键 - 循环里
oil_value[item].split()是错误写法,item是列表元素,不能作为索引使用
问题1:获取数组中每行的最后一项
核心是先正确解析每行数据,再通过[-1]索引取最后一项,同时跳过空行:
原生csv模块修正方案
import csv import matplotlib.pyplot as plt import seaborn as sns oil_value = [] with open(r"C:\Users\derek\Downloads\brent-monthly.csv", "r") as file: # 用制表符分隔,同时跳过字段前的空格 oil = csv.reader(file, delimiter='\t', skipinitialspace=True) for line in oil: # 跳过空行 if line: oil_value.append(line) # 提取每行最后一项 last_items = [line[-1] for line in oil_value] print(last_items)
pandas简化方案
pandas会自动处理多空格/制表符分隔的CSV,直接读取后取最后一列:
import pandas as pd df = pd.read_csv(r"C:\Users\derek\Downloads\brent-monthly.csv", sep='\s+', header=None) # 提取最后一列转成列表 last_items = df.iloc[:, -1].tolist() print(last_items)
问题2:提取CSV每行末尾的xx.xx格式数值
本质是把提取到的最后一项转换为浮点型,同时过滤无效行:
原生csv模块版本
import csv import matplotlib.pyplot as plt import seaborn as sns second_value = [] with open(r"C:\Users\derek\Downloads\brent-monthly.csv", "r") as file: oil = csv.reader(file, delimiter='\t', skipinitialspace=True) for line in oil: if line: # 尝试转换为浮点型,跳过无效行 try: num = float(line[-1]) second_value.append(num) except ValueError: continue # 绘制分布图 sns.distplot(second_value) plt.show()
pandas省心版本
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # sep='\s+'匹配任意多空格/制表符,指定列名方便处理 df = pd.read_csv(r"C:\Users\derek\Downloads\brent-monthly.csv", sep='\s+', header=None, names=['date', 'price']) # pandas自动识别数值类型,直接绘图 sns.distplot(df['price']) plt.show()
内容的提问来源于stack exchange,提问作者Joe Musashi
相关产品推荐
相关产品推荐

