Python 根据列表中选定的文件名从目录中读取文件

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参数。在随后的计算之后,我

我有大量的二维文件,从中计算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的文件。但这似乎不起作用,什么也没有返回。有人能帮忙吗

如果ndf
ndf
如下所示:

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列表中添加了文件路径。因此,您在编辑中提到的内容应该包含在本文中。