2015-03-17 2 views
-4

У меня есть приложение, которое работает. Но в интересах попытки лучше понять функции и питон. Я пытаюсь разделить его на различные функции.Как разбить код на более мелкие функции

Я застрял в функции file_IO. Я уверен, что причина, по которой она не работает, заключается в том, что основная часть приложения не понимает читателя или писателя. Чтобы лучше объяснить, вот полная копия приложения .

Также мне очень интересно об использовании csv.DictReader и csv.DictWriter. есть либо предоставить какие-либо преимущества/недостатки текущего кода?

Я полагаю, еще один способ сделать это с помощью классов, честно говоря, я бы как знать, как это сделать.

#!/usr/bin/python 

""" Description This script will take a csv file and parse it looking for specific criteria. 
A new file is then created based of the original file name containing only the desired parsed criteria. 
""" 

import csv 
import re 
import sys 

searched = ['aircheck', 'linkrunner at', 'onetouch at'] 

def find_group(row): 
    """Return the group index of a row 
     0 if the row contains searched[0] 
     1 if the row contains searched[1] 
     etc 
     -1 if not found 
    """ 
    for col in row: 
     col = col.lower() 
     for j, s in enumerate(searched): 
      if s in col: 
       return j 
     return -1 



#Prompt for File Name 
def file_IO(): 
    print "Please Enter a File Name, (Without .csv extension): ", 
    base_Name = raw_input() 
    print "You entered: ",base_Name 

    in_Name = base_Name + ".csv" 
    out_Name = base_Name + ".parsed.csv" 

    print "Input File: ", in_Name 
    print "OutPut Files: ", out_Name 

    #Opens Input file for read and output file to write. 
    in_File = open(in_Name, "rU") 
    reader = csv.reader(in_File) 

    out_File = open(out_Name, "wb") 
    writer = csv.writer(out_File, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) 

    return (reader, writer) 

file_IO() 

# Read header 
header = reader.next() 


stored = [] 
writer.writerow([header[0], header[3]]) 

for i, row in enumerate(reader): 
    g = find_group(row) 
    if g >= 0: 
     stored.append((g, i, row)) 
stored.sort() 

for g, i, row in stored: 
    writer.writerow([row[0], row[3]]) 


# Closing Input and Output files. 
in_File.close() 
out_File.close() 
+3

У вас есть немало вопросов, некоторые из которых не относятся к теме (слишком широкие) для SO. Пожалуйста, упростите и уточните только один вопрос. – isherwood

+1

Если вы можете заставить свой код работать, тогда вопросы об его очистке и улучшении стиля гораздо лучше подходят для сайта codereview: http://codereview.stackexchange.com/ – shuttle87

+0

Хорошо, справедливо, тогда будет актуальный вопрос. С текущим кодом я получаю сообщение об ошибке последующого ./test.py Пожалуйста, введите имя файла (без расширения .csv): YouTubeVideoViewsDec2014 Вы ввели: YouTubeVideoViewsDec2014 входной файл: YouTubeVideoViewsDec2014.csv выходных файлов: YouTubeVideoViewsDec2014.parsed. CSV Traceback (самый последний вызов последнего): Файл "./test.py", строка 56, в заголовка = reader.next() NameError: имя 'читатель' не определен –

ответ

0

Если бы я был вами, я бы выделил только find_group.

import csv 

def find_group(row): 
    GROUPS = ['aircheck', 'linkrunner at', 'onetouch at'] 
    for idx, group in enumerate(GROUPS): 
     if group in map(str.lower, row): 
      return idx 
    return -1 

def get_filenames(): 
    # this might be the only other thing you'd want to factor 
    # into a function, and frankly I don't really like getting 
    # user input this way anyway.... 
    basename = raw_input("Enter a base filename (no extension): ") 
    infilename = basename + ".csv" 
    outfilename = basename + ".parsed.csv" 
    return infilename, outfilename 
    # notice that I don't open the files yet -- let main handle that 

infilename, outfilename = get_filenames() 

with open(infilename, 'rU') as inf, open(outfilename, 'wb') as outf: 
    reader = csv.reader(inf) 
    writer = csv.writer(outf, delimiter=',', 
         quotechar='"', quoting=csv.QUOTE_ALL) 
    header = next(reader) 
    writer.writerow([[header[0], header[3]]) 
    stored = sorted([(find_group(row),idx,row) for idx,row in 
        enumerate(reader)) if find_group(row) >= 0]) 
    for _, _, row in stored: 
     writer.writerow([row[0], row[3]]) 
+0

Единственная строка, с которой я сталкиваюсь с трудным временем, обертывающим мою голову, сохраняется = sorted ([(find_group (row), idx, row) для idx, строка в перечисляет (читатель)), если find_group (row)]) Я думаю, что это просто причина его одной длинной линии. Является ли пользовательский ввод обычно собранным из основного. Любопытно, что есть какой-либо pro/con для ввода пользователем функции vs main. Может быть. Это было бы лучшим решением. Также, если это имеет значение, я работаю в Python 3.4.3. Sop the raw_input() изменился на просто input() Спасибо за вашу помощь. Это действительно упрощает исходный код. –

+0

для каждой строки в 'читателе', он выполняет цикл' for' для '(index_of_row, row)'. Если 'find_group (row)> = 0' (то есть, он находит одну из ваших групп в этой строке), он добавляет кортеж' (find_group (row), index_of_row, row) 'в результирующий список. Это все обернуто «сортированным» вызовом, поэтому все это сортируется группой. –

+0

Примечание. Я сделал ошибку в этом коде - 'if find_group (row)' должен быть 'if find_group (row)> = 0'. Исходный код будет отображать все строки, которые либо не найдены, либо найти что-то другое, чем 'aircheck' (так как поиск' aircheck' вернет '0') –

Смежные вопросы