Запуск одного и того же кода для нескольких файлов Python - PullRequest
0 голосов
/ 07 марта 2020

Я написал код, как вы можете видеть (я знаю, что он может быть написан лучше). Итак, мой вопрос, как я могу запустить этот код для нескольких файлов в папке? Могу ли я использовать "для l oop" для этого? Мои файлы находятся в папке с именем assignment1 , и я не могу понять, как это сделать. Спасибо, что потратили время на чтение.

bands = list()

filename = "file1000"
with open (filename) as fin:
    for line in fin:
        bands.append(line.strip())


def partition(bands, start, end):
    pivot = bands[start]
    low = start + 1
    high = end

    while True:
        while low <= high and bands[high] >= pivot:
            high = high - 1
        while low <= high and bands[low] <= pivot:
            low = low + 1
        if low <= high:
            bands[low], bands[high] = bands[high], bands[low]
        else:
            break

    bands[start], bands[high] = bands[high], bands[start]

    return high

def quick_sort(array, start, end):
    if start >= end:
        return

    p = partition(array, start, end)
    quick_sort(array, start, p-1)
    quick_sort(array, p+1, end)


def heapify(bands, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2

    if l < n and bands[i] < bands[l]:
        largest = l

    if r < n and bands[largest] < bands[r]:
        largest = r

    if largest != i:
        bands[i], bands[largest] = bands[largest], bands[i]
        heapify(bands, n, largest)

def heapSort(bands):
    n = len(bands)


    for i in range(n, -1, -1):
        heapify(bands, n, i)


    for i in range(n - 1, 0, -1):
        bands[i], bands[0] = bands[0], bands[i]
        heapify(bands, i, 0)


def mergeSort(bands):
    if len(bands) > 1:
        mid = len(bands) // 2
        L = bands[:mid]
        R = bands[mid:]

        mergeSort(L)
        mergeSort(R)

        i = j = k = 0

        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                bands[k] = L[i]
                i += 1
            else:
                bands[k] = R[j]
                j += 1
            k += 1

        while i < len(L):
            bands[k] = L[i]
            i += 1
            k += 1

        while j < len(R):
            bands[k] = R[j]
            j += 1
            k += 1


def insertionSort(bands):
    for i in range(1, len(bands)):

        key = bands[i]

        j = i - 1
        while j >= 0 and key < bands[j]:
            bands[j + 1] = bands[j]
            j -= 1
        bands[j + 1] = key

import time
start_time = time.time()
quick_sort(bands, 0, len(bands) - 1)
file = open("time.txt","a")
file.write(str(time.time() - start_time))
file.write("        ")
file.close()

start_time = time.time()
heapSort(bands)
file = open("time.txt","a")
file.write(str(time.time() - start_time))
file.write("        ")
file.close()

start_time = time.time()
mergeSort(bands)
file = open("time.txt","a")
file.write(str(time.time() - start_time))
file.write("        ")
file.close()

start_time = time.time()
insertionSort(bands)
file = open("time.txt","a")
file.write(str(time.time() - start_time))
file.write("        ")
file.close()

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Вы можете использовать os.listdir(folder), чтобы получить все имена в папке (это будут имена файлов и подпапок), а затем вы можете использовать for -l oop для запуска кода с каждым именем файла. listdir() дает только имена файлов, и вам нужно os.path.join(), чтобы создать полный путь к файлу. Вы также можете использовать if для фильтрации имен.

import os

folder = "/path/to/assignment"

for name in os.listdir(folder): 
    if name.startswith("file"): # use it if you have to filter files by name
        filename = os.path.join(folder, name)
        print(filename)

        # ... your code ...

В конечном итоге вы можете использовать glob для этого. Это может быть полезно, если вы хотите фильтровать имена. Для всех имен используйте *. Для файла вы можете использовать ie *.txt или file*, и т. Д. c.

import glob

#for filename in glob.glob("/path/to/assignment/file*.txt"):
for filename in glob.glob("/path/to/assignment/*"):
     print(filename)

     # ... your code ...

Если вам нужно также попасть в подпапки, вы можете использовать os.walk(folder)

import os

folder = "/path/to/assignment"

for root, dirs, files in os.walk(folder):
     for name in files:
         if name.startswith("file"): # use it if you have to filter files by name
             filename = os.path.join(root, name)
             print(filename)

             # ... your code ...
1 голос
/ 07 марта 2020

Вы можете использовать:

d="**Provide the directory here**"
files=os.listdir(d)
file=[i[:-4] for i in files]          #To store the csv file name as DataFrame name without the '.csv' part
a=[]
for i in range(len(files)):
    exec("%s=pd.read_csv(d+files[i])"%file[i])
    a.append(file[i])

Теперь у вас список DataFrames в «а». Вы можете выполнить итерацию для каждого из них и передать его в свою функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...