4
\$\begingroup\$

I have finished a really short and small import / export script using Python 2.7, and now I would like to structure it using classes and methods where possible.

Could anybody give me some advice on what would be the best approach for this?

I haven't used any OOP because I would also like somebody to give me some best practices on how this should be done/structured.

from similarweb import ContentClient
import csv
FILE_OUT = 'similarweb/new_domains.csv'
FILE_IN = 'similarweb/domains.csv'
content_client = ContentClient("some_key")
final_result = ""
with open(FILE_IN, 'r') as csv_read_file:
 reader = csv.reader(csv_read_file)
 for i, line in enumerate(reader):
 url = ', '.join(str(e) for e in line)
 final_result += url + " " + (content_client.category(url)['Category']) + "\n"
with open(FILE_OUT, 'w') as csv_write_file:
 csv_write_file.write(final_result)
200_success
146k22 gold badges190 silver badges479 bronze badges
asked May 29, 2015 at 7:47
\$\endgroup\$
0

2 Answers 2

4
\$\begingroup\$

Rather than going down the OOP route, I would just split this out into a few functions:

import csv
from similarweb import ContentClient
CLIENT_KEY = 'some_key'
FILE_IN = 'similarweb/domains.csv'
FILE_OUT = 'similarweb/new_domains.csv'
def extract_data(path, client):
 """Extract the data from the specified path using the client."""
 lines = []
 with open(path) as read_file:
 for line in csv.reader(read_file):
 url = ', '.join(line) # see note below
 lines.append(' '.join(
 (url, client.category(url)['Category'])
 ))
 return '\n'.join(lines)
def save_data(path, data):
 """Save the data to the specified path."""
 with open(path, 'w') as csv_write_file:
 csv_write_file.write(data) 
if __name__ == '__main__':
 save_data(FILE_OUT, extract_data(FILE_IN, ContentClient(CLIENT_KEY)))

Per the documentation:

Each row read from the csv file is returned as a list of strings. No automatic data type conversion is performed.

so there is no need to explicitly convert to strings.

answered May 29, 2015 at 9:27
\$\endgroup\$
6
  • \$\begingroup\$ This is exactly what I was trying to accomplish ! Thanks @jonrsharpe for this fast turnaround and the explanations. I have in a csv file some words(each on each line - so one column) and when i export it there will be two columns. I just have one question: is there a way to separate these columns by tabs ? \$\endgroup\$ Commented May 29, 2015 at 9:41
  • \$\begingroup\$ @Alexander read the CSV documentation I've already linked to, which explains how to set the delimiter - a comma is the default, but you can specify an alternative if you want. \$\endgroup\$ Commented May 29, 2015 at 9:42
  • \$\begingroup\$ I tried before and also now and there's just a simple space. for line in csv.reader(read_file, delimiter=','): won't work \$\endgroup\$ Commented May 29, 2015 at 9:50
  • \$\begingroup\$ @Alexander I'm not sure what the problem is - I thought you wanted to change the delimiter for the output file? You should cut down to a minimal example and take the question to Stack Overflow if you really can't get the code to work, but I suggest you spend more time with the documentation and some experimentation first. \$\endgroup\$ Commented May 29, 2015 at 9:52
  • \$\begingroup\$ The problem is that I've tried in many ways to do it but didn't succeed \$\endgroup\$ Commented May 29, 2015 at 10:41
3
\$\begingroup\$

Writing classes is not an aim in itself, it is just a tool. Sometimes it's useful, sometimes it's not. I recommend the talk Stop Writing Classes.

Your code looks OK as it is, even if a few things can be improved. For instance, I'm not sure you use the value i so you probably don't need enumerate.

jonrsharpe
14k2 gold badges36 silver badges62 bronze badges
answered May 29, 2015 at 8:05
\$\endgroup\$
3
  • \$\begingroup\$ you're right, I've changed that. I missed it because I used it at some point. More, I would like to structure my code so that it would be more readable.More, I'd also like to have this done for learning purposes on my own example. I am asking for some OOP for my code because it will probably become bigger and bigger. Would you give it a try with a structure and some explanations along it ? \$\endgroup\$ Commented May 29, 2015 at 8:51
  • \$\begingroup\$ @Alexander OOP isn't the only way to structure "bigger and bigger"; it's important if you need to combine state and behaviour, but otherwise a sensible module of functions would be more flexible. \$\endgroup\$ Commented May 29, 2015 at 9:13
  • \$\begingroup\$ That's what I am looking for @jonrsharpe . I was thinking of putting the hole thing in a class something(): using some def methods(): and a main(). But I don't have any experience and I want to learn the best way of doing it \$\endgroup\$ Commented May 29, 2015 at 9:20

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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.