Python 根据列表中选定的文件名从目录中读取文件
我有大量的二维文件,从中计算XX参数,如下所示Python 根据列表中选定的文件名从目录中读取文件,python,list,file,csv,fnmatch,Python,List,File,Csv,Fnmatch,我有大量的二维文件,从中计算XX参数,如下所示 '2019-10-12_17-43.csv', '2019-10-12_17-42.csv', '2019-10-12_17-41.csv', '2019-10-12_17-44.csv', '2019-10-12_17-40.csv', '2019-10-11_17-40.csv', ...................... and so on... 我能够创建一个文件名列表,并计算该特定文件的XX参数。在随后的计算之后,我
'2019-10-12_17-43.csv',
'2019-10-12_17-42.csv',
'2019-10-12_17-41.csv',
'2019-10-12_17-44.csv',
'2019-10-12_17-40.csv',
'2019-10-11_17-40.csv',
......................
and so on...
我能够创建一个文件名列表,并计算该特定文件的XX参数。在随后的计算之后,我创建了一个名为YY的数据帧,其中包含参数以及包含从中计算参数的文件名的列。根据计算出的XX参数的特定值,我想绘制产生它的所有二维数据。我还从数据框的列创建了一个文件名列表。显然,在XX参数计算之前,代码会更长,但为了从列表中选定的文件名中读取数据,我在最后一个块中使用了以下代码:
# arbitrary functions
def Aval (a, b):
..............
def Bval (a, b):
..............
file_path = r"C:\Users\Desktop\Data"
read_files = glob.glob(os.path.join(file_path,"*.csv"))
# generating the list of filenames
file_list = []
XYZ_array = []
ABC_array = []
for (root, dirs, files) in os.walk(file_path):
for filenames in files:
file_list.append(filenames)
df= pd.read_csv(os.path.join(root, filenames), header=0)
#Calculation from the files
ABC = ..................
XYZ = ..................
ABC_array.append(ABC)
XYZ_array.append(XYZ)
#creating a dataframe from the arrays
newdf = pd.DataFrame ({'ABC': ABC_array, 'XYZ':XYZ_array, 'Filename':file_list })
生成的数据帧如下所示:
Timestamp ABC XYZ Filename
2019-10-11_07-52 1.934985 0.187962 2019-10-11_07-52.csv
2019-10-11_07-53 1.926435 0.200828 2019-10-11_07-53.csv
2019-10-11_07-54 1.922927 0.215204 2019-10-11_07-54.csv
2019-10-11_07-55 1.951818 0.216678 2019-10-11_07-55.csv
2019-10-11_07-56 1.922523 0.245144 2019-10-11_07-56.csv
... ... ... ...
2019-10-13_18-21 2.028409 1.149067 2019-10-13_18-21.csv
2019-10-13_18-22 2.027896 1.015862 2019-10-13_18-22.csv
2019-10-13_18-23 2.013004 0.871320 2019-10-13_18-23.csv
2019-10-13_18-24 1.991576 0.755164 2019-10-13_18-24.csv
2019-10-13_18-25 1.908259 0.570786 2019-10-13_18-25.csv
>>> ndf
Filename Bin_names
0 2019-10-12_17-43.csv 1.76
1 2019-10-12_17-42.csv 1.76
2 2019-10-12_17-41.csv 1.76
3 2019-10-12_17-44.csv 1.76
4 2019-10-12_17-40.csv 1.76
>>> filename_list = ndf['Filename'].to_list()
>>> filename_list
['2019-10-12_17-43.csv', '2019-10-12_17-42.csv', '2019-10-12_17-41.csv', '2019-10-12_17-44.csv', '2019-10-12_17-40.csv']
ABC值分为三个箱子
垃圾箱=[1.76,1.86,1.96]
Abc_sorted = newdf.sort_values('ABC')
Abc_sorted['Bin_names'] = pd.cut(Abc_sorted['ABC'], bins, labels=['1.76','1.86','1.96'])
T_df = Abc_sorted.sort_values(by=['Bin names']).dropna()
结果会产生如下数据帧:
Timestamp ABC XYZ Filename Bin_names
2019-10-12_17-43 1.769676 72.841836 2019-10-12_17-43.csv 1.76
2019-10-12_17-42 1.771429 74.583635 2019-10-12_17-42.csv 1.76
2019-10-12_17-41 1.774526 76.104981 2019-10-12_17-41.csv 1.76
2019-10-12_17-44 1.774678 68.314091 2019-10-12_17-44.csv 1.76
2019-10-12_17-40 1.779273 76.589191 2019-10-12_17-40.csv 1.76
... ... ... ... ... ... ... ... ... ...
2019-10-12_09-48 1.988249 85.279987 2019-10-12_09-48.csv 1.96
2019-10-13_09-04 1.988266 28.716690 2019-10-13_09-04.csv 1.96
2019-10-12_11-27 1.988597 76.978562 2019-10-12_11-27.csv 1.96
2019-10-11_16-19 1.985438 76.343396 2019-10-11_16-19.csv 1.96
2019-10-11_08-11 1.999933 0.251199 2019-10-11_08-11.csv 1.96
将根据bin_名称1.76和文件名as创建一个新的数据框,并将包含文件名的列表创建为:
ndf = T_df.loc[Total_df.Bin_names =='1.76'][['Filename', 'Bin_names']]
filename_list=ndf['Filename'].tolist()
这导致数据帧为:
Filename Bin_names
2019-10-12_17-43.csv 1.76
2019-10-12_17-42.csv 1.76
2019-10-12_17-41.csv 1.76
2019-10-12_17-44.csv 1.76
2019-10-12_17-40.csv 1.76
现在主要任务是从主目录导入filename_列表中的文件:
for i in range(len(filename_list)):
print (filename_list[i])
for file in read_files:
if fnmatch.fnmatch(file, filename_list[i]):
print(file)
其中,
read\u files
是路径,file
是路径中的文件名,filename\u list
是包含多个文件的列表。我已经将数据分为3个不同的值,我只想导入赋予ABC参数值1.76的文件。但这似乎不起作用,什么也没有返回。有人能帮忙吗 如果ndfndf
如下所示:
Timestamp ABC XYZ Filename
2019-10-11_07-52 1.934985 0.187962 2019-10-11_07-52.csv
2019-10-11_07-53 1.926435 0.200828 2019-10-11_07-53.csv
2019-10-11_07-54 1.922927 0.215204 2019-10-11_07-54.csv
2019-10-11_07-55 1.951818 0.216678 2019-10-11_07-55.csv
2019-10-11_07-56 1.922523 0.245144 2019-10-11_07-56.csv
... ... ... ...
2019-10-13_18-21 2.028409 1.149067 2019-10-13_18-21.csv
2019-10-13_18-22 2.027896 1.015862 2019-10-13_18-22.csv
2019-10-13_18-23 2.013004 0.871320 2019-10-13_18-23.csv
2019-10-13_18-24 1.991576 0.755164 2019-10-13_18-24.csv
2019-10-13_18-25 1.908259 0.570786 2019-10-13_18-25.csv
>>> ndf
Filename Bin_names
0 2019-10-12_17-43.csv 1.76
1 2019-10-12_17-42.csv 1.76
2 2019-10-12_17-41.csv 1.76
3 2019-10-12_17-44.csv 1.76
4 2019-10-12_17-40.csv 1.76
>>> filename_list = ndf['Filename'].to_list()
>>> filename_list
['2019-10-12_17-43.csv', '2019-10-12_17-42.csv', '2019-10-12_17-41.csv', '2019-10-12_17-44.csv', '2019-10-12_17-40.csv']
而filename\u列表
如下所示:
Timestamp ABC XYZ Filename
2019-10-11_07-52 1.934985 0.187962 2019-10-11_07-52.csv
2019-10-11_07-53 1.926435 0.200828 2019-10-11_07-53.csv
2019-10-11_07-54 1.922927 0.215204 2019-10-11_07-54.csv
2019-10-11_07-55 1.951818 0.216678 2019-10-11_07-55.csv
2019-10-11_07-56 1.922523 0.245144 2019-10-11_07-56.csv
... ... ... ...
2019-10-13_18-21 2.028409 1.149067 2019-10-13_18-21.csv
2019-10-13_18-22 2.027896 1.015862 2019-10-13_18-22.csv
2019-10-13_18-23 2.013004 0.871320 2019-10-13_18-23.csv
2019-10-13_18-24 1.991576 0.755164 2019-10-13_18-24.csv
2019-10-13_18-25 1.908259 0.570786 2019-10-13_18-25.csv
>>> ndf
Filename Bin_names
0 2019-10-12_17-43.csv 1.76
1 2019-10-12_17-42.csv 1.76
2 2019-10-12_17-41.csv 1.76
3 2019-10-12_17-44.csv 1.76
4 2019-10-12_17-40.csv 1.76
>>> filename_list = ndf['Filename'].to_list()
>>> filename_list
['2019-10-12_17-43.csv', '2019-10-12_17-42.csv', '2019-10-12_17-41.csv', '2019-10-12_17-44.csv', '2019-10-12_17-40.csv']
文件位于
file_path = r"C:\Users\Desktop\Data"
然后,所有文件的完整路径应该是
>>> [os.path.join(file_path, name) for name in filename_list]
['C:\\Users\\Desktop\\Data\\2019-10-12_17-43.csv', 'C:\\Users\\Desktop\\Data\\2019-10-12_17-42.csv', 'C:\\Users\\Desktop\\Data\\2019-10-12_17-41.csv', 'C:\\Users\\Desktop\\Data\\2019-10-12_17-44.csv', 'C:\\Users\\Desktop\\Data\\2019-10-12_17-40.csv']
>>>
您还可以将文件路径添加到Filename
列中
>>> ndf.Filename.apply(lambda x: os.path.join(file_path,x))
0 C:\Users\Desktop\Data\2019-10-12_17-43.csv
1 C:\Users\Desktop\Data\2019-10-12_17-42.csv
2 C:\Users\Desktop\Data\2019-10-12_17-41.csv
3 C:\Users\Desktop\Data\2019-10-12_17-44.csv
4 C:\Users\Desktop\Data\2019-10-12_17-40.csv
Name: Filename, dtype: object
>>>
或者使用pathlib
>>> import pathlib
>>> p = pathlib.PurePath(file_path)
>>> ndf.Filename.apply(p.joinpath)
0 C:\Users\Desktop\Data\2019-10-12_17-43.csv
1 C:\Users\Desktop\Data\2019-10-12_17-42.csv
2 C:\Users\Desktop\Data\2019-10-12_17-41.csv
3 C:\Users\Desktop\Data\2019-10-12_17-44.csv
4 C:\Users\Desktop\Data\2019-10-12_17-40.csv
Name: Filename, dtype: object
>>>
您使用
os.walk
查找所有文件,然后将文件名附加到列表中,但必须使用os.path.join(root,filenames)
打开文件。可能文件位于不同的目录中,当您创建文件列表时,您应该保存整个路径
——这样您就可以使用文件的绝对路径访问文件,而无需搜索它们。什么是i
?没有返回任何内容,因为您只是在打印。可能需要更多的信息。请阅读、编写一个简单的玩具示例,以复制该问题。@wwii该问题现在更新为更清晰的文本和代表性代码。提前感谢。ndf=T_df。loc…
是给您带来麻烦的一行,但是没有人能告诉您,因为我们不知道newdf
中有什么,我们也不知道T_df
看起来像什么,也不知道您是如何组合数据的。本手册的目的是为我们提供重新创建问题所需的一切,包括代表性数据,重点是最小化(针对代码和数据)-有时,为您的问题制作mre会在您得到答案之前为您突出问题。可以安全地说,newdf
可以通过以下方式制作/模仿:import numpy as np;作为pd进口大熊猫;导入随机、字符串;abc=np.random.default\u rng().normal(1.5,51000);xyz=np.random.default_rng().normal(1.5,5,1000);fnames=[''.join(random.choices(string.ascii_字母,k=7))表示范围(1000)]内的u;newdf=pd.DataFrame({'ABC':ABC,'XYZ':XYZ,'Filename':fnames})
??如果是这样的话,请在您的问题中包括这一点(因为我们没有任何csv文件,所有这些内容都是无关的)。然后,我们肯定需要知道您是如何制作分配给newdf['Bin names']
——这似乎是您问题的一部分,但您只是跳过了。感谢您的帮助。导入选定文件的最后一段仍然不显示任何内容。我在这里遗漏了什么吗?仍然没有显示任何内容
-我不知道这是什么意思。请参阅编辑。假设我想从整个文件列表中读取ndf数据框中列出的文件的内容并进行计算。最后一部分本来应该是那个部分,但那不起作用。循环的第二个功能不正常,因为当此段运行时,除了从ndf
数据帧创建的文件名列表中的文件名外,不会显示任何内容。根据您先前的建议,我已在filename\u列表中添加了文件路径。因此,您在编辑中提到的内容应该包含在本文中。