Python - Glob - 根据文件名读入.csv数据,并根据文件名用颜色绘制数据
Python - Glob - Reading in .csv data according to filename, and plotting data with color according to the filename
我正在将 .csv 格式的多个数据记录器文件读入 Python。我的objective如下:
- 从我的目录中读取每个文件,如果文件名以 K 开头,则以一种颜色绘制它...如果文件名以 Z 开头,则以另一种颜色绘制这些数据点。
- 所以,实际上,我想要一个只有两种颜色的图。一种颜色来自以“K”开头的文件,另一种颜色来自以“Z”开头的文件。
我卡在哪里:
在下面的代码中,我只读入了 filenamesK 中的文件。但是,我想将 filenamesZ 合并到这个循环中并将它们绘制在同一个图表上。
我在 Python 编程已经有几年了(不再担任技术角色),我知道可能有更有效的方法来做我的事情'我正在做 :) .
import pandas as pd
import matplotlib.pyplot as plt
from glob import glob
filenamesK = glob("C:/Users/K*.csv")
filenamesZ = glob("C:/Users/Z*.csv")
fig, ax = plt.subplots()
for f in filenamesK:
df = pd.read_csv(f, sep=',',skiprows=24)
df.columns=['sample','Time','ms','Temperature',]
df=df.astype(str)
df["Temperature"] = df["Temperature"].str.replace('\+ ', '').str.replace(' ', '').astype(float)
color = next(ax._get_lines.prop_cycler)['color']
ax.plot(df[["Temperature"]], color=color)
plt.show()
只需使用 []
范围作为起始字符:
import glob
for name in glob.glob('[K,Z]*.csv'):
if name.startswith('K'):
color = 'r'
elif name.startswith('K'):
color = 'g'
else:
color = 'k'
# the rest of the code <...>
不过好像glob
可以区分大小写,不区分大小写depending on the system。
所以,也许更好的解决方案是使用 re
模块:
import os
import re
regex = '?P<key>(K|Z).*\.scv'
for fname in os.listdir(path):
search = re.search(regex, fname)
if search:
if search.group('key') == 'K':
color = 'r'
elif search.group('key') == 'Z':
color = 'g'
else:
color = 'k'
# rest of the code <...>
(目前唯一的)其他答案似乎很简单,但是,我建议为您的绘图创建一个函数,而不是在长 for
循环中嵌套大量 if
语句。
下面是一个简单的函数,它采用 filename
(从中加载数据)、要绘制的 ax
以及您希望绘图具有的 color
..
import pandas as pd
import matplotlib.pyplot as plt
from glob import glob
filenamesK = glob("C:/Users/K*.csv")
filenamesZ = glob("C:/Users/Z*.csv")
def plot_data(filename, fig_ax, color):
df = pd.read_csv(filename, sep=',',skiprows=24)
df.columns=['sample','Time','ms','Temperature',]
df=df.astype(str)
df["Temperature"] = df["Temperature"].str.replace('\+ ', '').str.replace(' ', '').astype(float)
# no need for this:
# color = next(fig_ax._get_lines.prop_cycler)['color']
fig_ax.plot(df[["Temperature"]], color=color)
fig, ax = plt.subplots()
for f in filenamesK:
plot_data(f, ax, 'blue')
for f in filenamesZ:
plot_data(f, ax, 'red')
plt.show()
这可以通过提取另一个用于读取数据的函数来进一步改进(在可读性方面)。也就是说,一种用于从给定文件中读取数据,另一种用于绘制数据。
我正在将 .csv 格式的多个数据记录器文件读入 Python。我的objective如下:
- 从我的目录中读取每个文件,如果文件名以 K 开头,则以一种颜色绘制它...如果文件名以 Z 开头,则以另一种颜色绘制这些数据点。
- 所以,实际上,我想要一个只有两种颜色的图。一种颜色来自以“K”开头的文件,另一种颜色来自以“Z”开头的文件。
我卡在哪里:
在下面的代码中,我只读入了 filenamesK 中的文件。但是,我想将 filenamesZ 合并到这个循环中并将它们绘制在同一个图表上。
我在 Python 编程已经有几年了(不再担任技术角色),我知道可能有更有效的方法来做我的事情'我正在做 :) .
import pandas as pd import matplotlib.pyplot as plt from glob import glob filenamesK = glob("C:/Users/K*.csv") filenamesZ = glob("C:/Users/Z*.csv") fig, ax = plt.subplots() for f in filenamesK: df = pd.read_csv(f, sep=',',skiprows=24) df.columns=['sample','Time','ms','Temperature',] df=df.astype(str) df["Temperature"] = df["Temperature"].str.replace('\+ ', '').str.replace(' ', '').astype(float) color = next(ax._get_lines.prop_cycler)['color'] ax.plot(df[["Temperature"]], color=color) plt.show()
只需使用 []
范围作为起始字符:
import glob
for name in glob.glob('[K,Z]*.csv'):
if name.startswith('K'):
color = 'r'
elif name.startswith('K'):
color = 'g'
else:
color = 'k'
# the rest of the code <...>
不过好像glob
可以区分大小写,不区分大小写depending on the system。
所以,也许更好的解决方案是使用 re
模块:
import os
import re
regex = '?P<key>(K|Z).*\.scv'
for fname in os.listdir(path):
search = re.search(regex, fname)
if search:
if search.group('key') == 'K':
color = 'r'
elif search.group('key') == 'Z':
color = 'g'
else:
color = 'k'
# rest of the code <...>
(目前唯一的)其他答案似乎很简单,但是,我建议为您的绘图创建一个函数,而不是在长 for
循环中嵌套大量 if
语句。
下面是一个简单的函数,它采用 filename
(从中加载数据)、要绘制的 ax
以及您希望绘图具有的 color
..
import pandas as pd
import matplotlib.pyplot as plt
from glob import glob
filenamesK = glob("C:/Users/K*.csv")
filenamesZ = glob("C:/Users/Z*.csv")
def plot_data(filename, fig_ax, color):
df = pd.read_csv(filename, sep=',',skiprows=24)
df.columns=['sample','Time','ms','Temperature',]
df=df.astype(str)
df["Temperature"] = df["Temperature"].str.replace('\+ ', '').str.replace(' ', '').astype(float)
# no need for this:
# color = next(fig_ax._get_lines.prop_cycler)['color']
fig_ax.plot(df[["Temperature"]], color=color)
fig, ax = plt.subplots()
for f in filenamesK:
plot_data(f, ax, 'blue')
for f in filenamesZ:
plot_data(f, ax, 'red')
plt.show()
这可以通过提取另一个用于读取数据的函数来进一步改进(在可读性方面)。也就是说,一种用于从给定文件中读取数据,另一种用于绘制数据。