in CODING, Python

Python: Build Application List

My first major Python script!

I created a script that took the list of applications from a standard build then compares to a CSV file from a users current machine, subtracts them and what’s left is the additional apps to add at build time.

It uses `csv.Sniffer` to work out what the delimiter is so it can detect if its ‘,’ or ‘;’ or tabs, etc. [Line 13 is where the heavy lifting is]

Here’s the script:

#!/usr/local/bin/python3

# Imports
import csv, os, pathlib, glob
from pprint import pprint


def read_csv_delimit(csv_file):
    # Initialise list
    file_csv = []
    # Open csv & check delimiter
    with open(csv_file, newline='', encoding = "ISO-8859-1") as csvfile:
        dialect = csv.Sniffer().sniff(csvfile.read(1096))
        csvfile.seek(0)
        reader = csv.reader(csvfile, dialect)
        for item in reader:
            file_csv.append(item[0])
        #del file_csv[0]
        return file_csv

def write_csv(file_dir, csv_file, new_machine_list):
    # Open file then write the lines
    if os.path.exists(file_dir + "/" + csv_file):
        append_write = 'a'
    else:
        append_write = 'w'

    file_name = csv_file
    
    with open(file_dir + "/" + csv_file, "w") as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        writer.writerow([file_name])
        for line in new_machine_list:
            writer.writerow([line]) 

def split_path(full_path):
    #path = path.rstrip(os.sep)
    head, tail = os.path.split(full_path)
    return (head, tail)

def enumMachines(machine_dir):
    machines = []
    for filename in glob.glob(machine_dir + "/*.csv"):
        machines.append(filename)
    return machines

def main():
    # Get the paths to the csv files
    app_csv = input("drop the app list csv here: ")
    machine_dir = input("drop the machines csv folder here: ")

    # Gets list of machines with extension of .csv
    machines = enumMachines(machine_dir)

    # get csv data
    app_list = read_csv_delimit(app_csv)

    for machine in machines:

        # import machine csv data
        machine_list = read_csv_delimit(machine)
        # delete the first row
        del machine_list[0]

        # list comprehension
        new_machine_list = [app for app in machine_list if app not in app_list]

        # get the machine csv name
        new_machine_dir, new_machine_csv = split_path(machine)

        # new folder to write to
        new_machine_dir = machine_dir + "/" + "edited"

        # create the new folder if it doesnt exist
        pathlib.Path(new_machine_dir).mkdir(parents=True, exist_ok=True)

        # Write the machine name first
        #write_csv(new_machine_dir, new_machine_csv, new_machine_csv)

        # write to the new csv
        write_csv(new_machine_dir, new_machine_csv, new_machine_list)



if __name__ == '__main__': main()