0

I created a simple script that goes to a notepad file, reads it line by line and if it finds certain words it adds to a counter. Then at the end it spits out the final count for each word.

The current implementation works, I just know it's not the most efficient way of doing things. I would love for someone with more experience to see if there is a simple FOR loop that can reduce the need of having 60 rows of the same thing. I am currently very inexperienced in Python and I'd love to find more efficient ways to do the same thing, this would help me learn new things

The code is here (it's long but just because I'm writing everything out manually, my goal is to accomplish the same thing with just a few lines using for loops)

location = "X:\Sales\Shortcuts\ShiftReportsIL.txt"
rep1 = "ttsachev"
rep2 = "vpopov"
rep3 = "alupashko"
rep4 = "ekarachorova"
rep5 = "glipchev"
rep6 = "ggeorgiev"
rep7 = "syovcheva"
rep8 = "vpanchev"
rep9 = "vbimbalova"
rep10 = "hmarinov"
rep11 = "fr-egonzalez"
rep12 = "dvaldenegro"
rep13 = "ndinev"
rep14 = "apiera"
rep15 = "csehunoe"
rep16 = "dbolingo"
rep17 = "mmamatela"
rep18 = "enter new rep here"
rep19 = "enter new rep here"


count = "count"

def Count():

        # setting the count of each "rep" to 0

        rep1count = 0
        rep2count = 0
        rep3count = 0
        rep4count = 0
        rep5count = 0
        rep6count = 0
        rep7count = 0
        rep8count = 0
        rep9count = 0
        rep10count = 0
        rep11count = 0
        rep12count = 0
        rep13count = 0
        rep14count = 0
        rep15count = 0
        rep16count = 0
        rep17count = 0
        rep18count = 0
        rep19count = 0


        global locationIL
        global locationAU
        global locationES

        # opening the first txt file
        
        with open(locationIL, 'r', encoding="utf8",  errors='ignore') as f:
                for line in f.readlines():
                        words = line.lower().split() 

                       # main for loop, going over each line and checking if the 
                       # username of each employee is present. If it is, it adds 
                       # 1 to that person's counter.

                        for word in words: 
                                if word == rep1:
                                        rep1count += 1
                                elif word == rep2:
                                        rep2count += 1
                                elif word == rep3:
                                        rep3count += 1
                                elif word == rep4:
                                        rep4count += 1
                                elif word == rep5:
                                        rep5count += 1
                                elif word == rep6:
                                        rep6count += 1
                                elif word == rep7:
                                        rep7count += 1
                                elif word == rep8:
                                        rep8count += 1
                                elif word == rep9:
                                        rep9count += 1
                                if word == rep10:
                                        rep10count += 1
                                elif word == rep11:
                                        rep11count += 1
                                elif word == rep12:
                                        rep12count += 1
                                elif word == rep13:
                                        rep13count += 1
                                elif word == rep14:
                                        rep14count += 1
                                elif word == rep15:
                                        rep15count += 1
                                elif word == rep16:
                                        rep16count += 1
                                elif word == rep17:
                                        rep17count += 1
                                elif word == rep18:
                                        rep18count += 1
                                elif word == rep19:
                                        rep19count += 1

        f.close

Thank you!

  • So have you looked into using a `list` to contain your data? – quamrana Mar 30 '21 at 13:23
  • No, I haven't. I thought about using dictionaries but the first implementation of it didn't quite work so I went with writing everything manually – Joseph Harari Mar 30 '21 at 13:24
  • For starters, see the "in" keyword https://stackoverflow.com/questions/3437059/does-python-have-a-string-contains-substring-method. Then you can have a list of the strings you are looking for, then have your for loop iterate over that list. – Scott Howard Mar 30 '21 at 13:25
  • So I googled it and it looks like a dictionary. So it would be to put the names of the employees in a list, and then use a for loop to go through each of the items in the list instead of adding them manually each time? How would that work in practice? – Joseph Harari Mar 30 '21 at 13:26
  • @ScottHoward I'll try re-creating the script using lists, dictionaries and "in", see how that goes! – Joseph Harari Mar 30 '21 at 13:31

1 Answers1

4

you could use a list for your items then a dict for the counts. for each rep in the counts dict check if it exists in the line.

location = "myfile.txt"
reps = ["ttsachev", "vpopov", "alupashko", "ekarachorova", "glipchev",
        "ggeorgiev", "syovcheva", "vpanchev", "vbimbalova",
        "hmarinov", "fr-egonzalez", "dvaldenegro", "ndinev", "apiera", "csehunoe",
        "dbolingo", "mmamatela", "enter new rep here"]


def count():
    # setting the count of each "rep" to 0
    rep_counts = {rep: 0 for rep in reps}

    # opening the first txt file

    with open(location, 'r', encoding="utf8", errors='ignore') as f:
        for line in f.readlines():
            words = line.lower().split()
            for rep in rep_counts:
                if rep in line.lower():
                    rep_counts[rep] += 1
    return rep_counts


counts = count()
print(counts)

SAMPLE DATA

this is a line hmarinov wth data
this is another mmamatela

OUTPUT

{'ttsachev': 0, 'vpopov': 0, 'alupashko': 0, 'ekarachorova': 0, 'glipchev': 0, 'ggeorgiev': 0, 'syovcheva': 0, 'vpanchev': 0, 'vbimbalova': 0, 'hmarinov': 1, 'fr-egonzalez': 0, 'dvaldenegro': 0, 'ndinev': 0, 'apiera': 0, 'csehunoe': 0, 'dbolingo': 0, 'mmamatela': 1, 'enter new rep here': 0}
Chris Doyle
  • 10,703
  • 2
  • 23
  • 42