循环浏览目录中的所有文件,并从每个文件中获取平均值

时间:2019-10-12 05:54:04

标签: python python-3.x file-io

我在目录中有几个文件,我想将所有文件中第一列的第一个和最后一个数字的平均值打印到文件中。请怎么做?

此代码不完整:

# giving names of all files in a directory to the file files.txt - OK
import os
files = os.listdir("/media/linux/DATADISK")

with open('files.txt', 'w') as f:
    for item in files:
        f.write("%s\n" % item)

# loading the first column of all files into lists or dataframes with the name/key according files.txt and save average value to file average.txt
for i in files:
    np.loadtext(f'   .  ', unpack=True, usecols=[0]))
    average = (list[0]+list[-1])/2
    print(average, , file=open("average.txt","a"))

我不知道如何编写第二个for循环,该循环应加载文件(第一列),计算最后一个值和第一个值的平均值,然后将其写入文件。它应该对目录中的所有文件执行此操作。我不知道如何写文件名-它们具有不同的名称和相同的扩展名。

例如,目录中有2个文件:klj.txt和gdf.dat

klj.txt

4 6 
6 5  
6 1

gdf.dat

4 5
2 0
8 1

输出average.txt应该是:

5 
6

1 个答案:

答案 0 :(得分:1)

首先,您不需要将文件写入 files.txt 的单独循环。您可以将整个操作作为os.listdir循环的一部分进行。您只需形成每个文件的完整路径(以后需要传递到np.loadtxt的路径)。像这样:

import os
data_path = os.path.abspath("/media/linux/DATADISK")

for f in os.listdir(data_path):
    f_path = os.path.join(data_path, f)
    print(f_path)

# Output:
# /media/linux/DATADISK/gdf.dat
# /media/linux/DATADISK/klj.txt

然后,您可以使用np.loadtxtdelimiter参数来指定每个文件的每一行都由空格分隔。如果您只对第一列感兴趣,则您输入的usecols参数是正确的。

data = np.loadtxt(f_path, delimiter=' ', usecols=0)
print(data)

# Output:
# /media/linux/DATADISK/gdf.dat
# [4. 2. 8.]
# /media/linux/DATADISK/klj.txt
# [4. 6. 6.]

然后,您已经拥有正确的平均代码部分。但我建议您先打开 average.txt 文件,这样您就不必在每个循环中open了。

with open("average.txt", "a") as output:
    for f in os.listdir(data_path):
        ...
        average = (data[0] + data[-1]) / 2
        output.write(str(average) + "\n")

将它们放在一起:

import numpy as np
import os
data_path = os.path.abspath("/media/linux/DATADISK")

with open("average.txt", "a") as output:
    for f in os.listdir(data_path):
        f_path = os.path.join(data_path, f)
        data = np.loadtxt(f_path, delimiter=' ', usecols=0)
        average = (data[0] + data[-1]) / 2
        output.write(str(average) + "\n")

样本 average.txt

6.0
5.0

顺序将取决于os.listdir的返回,因此 gdf.bat 将在 klj.txt 之前处理。