2

I have a csv file named film.csv the title of each column is as follows (with a couple of example rows):

Year;Length;Title;Subject;Actor;Actress;Director;Popularity;Awards;*Image
1990;111;Tie Me Up! Tie Me Down!;Comedy;Banderas, Antonio;Abril, Victoria;Almodóvar, Pedro;68;No;NicholasCage.png
1991;113;High Heels;Comedy;Bosé, Miguel;Abril, Victoria;Almodóvar, Pedro;68;No;NicholasCage.png
1983;104;Dead Zone, The;Horror;Walken, Christopher;Adams, Brooke;Cronenberg, David;79;No;NicholasCage.png
1979;122;Cuba;Action;Connery, Sean;Adams, Brooke;Lester, Richard;6;No;seanConnery.png
1978;94;Days of Heaven;Drama;Gere, Richard;Adams, Brooke;Malick, Terrence;14;No;NicholasCage.png
1983;140;Octopussy;Action;Moore, Roger;Adams, Maud;Glen, John;68;No;NicholasCage.png

I need to parse this csv with basic command (not using Pandas)

  1. How would I extract all movie titles with the actor first name = Richard , made before year 1985 , and award = yes ? (I have been able to get it to show lisy where awards == yes , but not the rest)

  2. How can I count how many times any given actor appears in the list?

file_name = "film.csv"
print('loading file')
lines = (line for line in open(file_name,encoding='cp1252')) #generator to capture lines
print('removing ;')
lists = (s.rstrip().split(";") for s in lines) #generators to capture lists containing values from lines

print('2-filter by awards')
sel = input()

if sel == '2': 
cols=next(lists) #obtains only the header
    print(cols)
    collections = (dict(zip(cols,data)) for data in lists)
    
    filtered = (col["Title"] for col in collections if col["Awards"][0]== "Y")
    for item in filtered:
        print(item)
    #   input()

        
#browse lists and index them per header values, then filter all movies that have been awarded
#using a new generator object
else: 
    

2 Answers 2

1

To read and filter the data you can use next example (I'm using award == No, because you don't have movie with award == Yes and other criteria in your example):

import csv
from collections import Counter

with open("data.csv", "r") as f_in:
    reader = csv.DictReader(f_in, delimiter=";")
    data = list(reader)

# extract all movie titles with the actor first name = Richard , made before year 1985 , and award = No

for d in data:
    if (
        d["Actor"].split(", ")[-1] == "Richard"
        and int(d["Year"]) < 1985
        and d["Awards"] == "No"
    ):
        print(d)

Prints:

{
    "Year": "1978",
    "Length": "94",
    "Title": "Days of Heaven",
    "Subject": "Drama",
    "Actor": "Gere, Richard",
    "Actress": "Adams, Brooke",
    "Director": "Malick, Terrence",
    "Popularity": "14",
    "Awards": "No",
    "*Image": "NicholasCage.png",
}

To get counter of actors you can use collections.Counter:

cnt = Counter(d["Actor"] for d in data)
print(cnt)

Prints:

Counter(
    {
        "Banderas, Antonio": 1,
        "Bosé, Miguel": 1,
        "Walken, Christopher": 1,
        "Connery, Sean": 1,
        "Gere, Richard": 1,
        "Moore, Roger": 1,
    }
)
Sign up to request clarification or add additional context in comments.

Comments

0

This will print out all movie titles that the actor's first name is Richard, made before 1985 and awards == Yes:

filter = {}
lines = open('test.csv', 'r').readlines()
columns = lines[0].strip().split(';')

lines.pop(0)

for i in lines:
    x = i.strip().split(';')
    # Checking if the movie was made before 1985
    if int(x[columns.index('Year')]) < 1985:
        # Checking if the actor's first name is Richard
        if x[columns.index('Actor')].split(', ')[1] == 'Richard':
            # Checking if awards == Yes
            if x[columns.index('Awards')] == 'Yes':
                # Printing out the title of the movie
                print(x[columns.index('Title')])

Counting if any given actor appears in the list:

name = "Gere, Richard" #   Given actor name

count = 0
for i in lines:
    x = i.strip().split(';')
    # Checking if the actor's name is the given name
    if x[columns.index('Actor')] == name:
        # If it is, add 1 to the count
        count += 1

Output: count: 1

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.