首页 > 解决方案 > 在多个文件夹上运行 Python 脚本

问题描述

今天我使用 Python 脚本,该脚本获取文件夹内的多个 CSV 文件,并生成一个 CSV 输出文件,其中包含按列的平均值,此外我还有多个类似的文件夹。但是我所做的是手动更改文件夹的名称和输出文件的名称,正如您可以想象的那样,这个过程非常困难。我正在寻找的是为每个文件夹执行此操作,尊重每个输出文件的名称和内容中每个相应文件夹的顺序和名称。

我正在尝试在我的 python 脚本中使用下一个

scriptname,f1name,f2name = sys.argv

我也使用 bash 脚本来制作它,但是在这个 bash 脚本中,我可以更改 python 脚本以在文件夹内的多个文件上运行它,但不能用于多个文件夹

#!/usr/bin/env bash

find ./escen10 -type f -name '*.csv' -print0 |
    while IFS= read -r -d $'\0' line; do
        nname=$(echo "$line" | sed "s/ecn/encn/") 
        python3 generator2.py $line $nname
    done

python脚本是下一个:

import os
import sys
from os import listdir
from csv import DictReader
from os import walk
from os import scandir
import numpy as np
import pandas as pd
scriptname,f1name,f2name = sys.argv

#delimiter = ';'
#dataInFolderPath = './nodes_escen1_1/'
#outputFile = 'results_escen1_1.csv'

delimiter = ';'
dataInFolderPath = f1name
outputFile = f2name


dataInFiles = sorted(listdir(dataInFolderPath),key=lambda x: int(x.split('_')[1]))

#sorted_files = sorted(dataInFolderPath)
lines = []
nodes = {}
for fileName in dataInFiles:

    file = open(dataInFolderPath + fileName)
    data = DictReader(file, delimiter=delimiter)
    for line in data:
        if not line['node_code'] in nodes.keys():
            nodes[line['node_code']] = []
        nodes[line['node_code']].append([
            line['node_code'],
            line['throughput[Mbps]'],
            line['data_packets_sent'],
            line['data_packets_lost'],
            line['rts_cts_sent'],
            line['rts_cts_lost']
        ])

    file.close()

output = ''
maxData = max([len(nodes[n]) for n in nodes])
keys = list(nodes.keys())
keys.sort()

for i in range(maxData):
    if i == 0:
        output += ';'.join(['node_code;throughput[Mbps];Data packets_sent;Data_packets lost;rts_cts_sent;rts_cts_lost'] * len(keys)) + '\n'

    for key in keys:
        if key != keys[0]:
            output += ';'

        if i >= len(nodes[key]):
            output += ';;;;;'
            continue

        output += ';'.join(nodes[key][i])
    output += '\n'

f = open(outputFile, 'w')
f.write(output)
f.close()

data = pd.read_csv(outputFile,sep=';')

data = data.append({'node_code':"Promedio"},ignore_index=True)

lenght = len(data["node_code"])

for i in range(len(data.columns)//6):
    if i ==0:
        data['throughput[Mbps]'].iloc[lenght-1] = np.average(data['throughput[Mbps]'][:-1])
    else:
        data['throughput[Mbps].%i'%i].iloc[lenght-1] = np.average(data['throughput[Mbps].%i'%i][:-1])

data.to_csv(outputFile,sep=';')

print(outputFile)

出于这个原因,我希望你能帮助我自动化这个过程,使用我可用的或其他更有效的解决方案来实现这个任务,提前感谢你的任何有用的帮助,问候!

标签: pythonbashcsvautomationdirectory

解决方案


推荐阅读