2016-06-21 5 views
1

Студент CS здесь, очень запутанный о том, как решить эту проблему ... mailingLabels.txt - просто пустой текстовый файл.Запись в текстовый файл из списка

Вот один пример строки из customerData.txt:

Eric,A,Stutler,568 Nuzum Court,East Aurora,NY,14052,US,[email protected],716-652-4943,male,11/24/1947

Инструкции:

Из функции main называют новую функцию generateMailingLabels обработать список клиентов для генерации текстовый файл, содержащий ярлыки для рассылки только для клиентов-клиентов в Айове (IA).

Общий подход вы должны принять это:

  • передать customerList в качестве параметра этой функции
  • открыть файл наклейки (mailingLabels.txt)
  • функции должны перебираю все клиент записи в списке
  • Если запись соответствует указанным выше критериям (женщина из Айовы), , создайте почтовую метку, объединив элементы выбора из запись клиента список полей, и
  • написать этикетку рассылки в файл (mailingLabels.txt)

Каждая метка рассылки должен быть отформатирован, как показано ниже с 5 пустых строк разделения каждой метки:

Jane Smith 
123 Main Street 
Cedar Falls, IA 50613 

Это мой текущий код:

def main(): 
    """ Opens file, reads customer information into a list, closes the file""" 

    custFile = open('customerData.txt','r') 
    customerList = generateList(custFile) 
    mailingList = open('mailingLabels.txt','w') 

    # Echo first and last enter from the customerList 
    print "customerList[0]:", customerList[0] 
    print "customerList[-1]:",customerList[-1] 

    custFile.close() 

def generateList(custFile): 
    """ Reads customer data from file and returns a list of customers""" 
    customers = [] 
    for line in custFile: 
     # Strip the new-line character from the end of the line, then split 
     # the line on the commas (',') to get a list of customer fields 
     custInfoList = line.strip().split(',') 
     customers.append(custInfoList) 
    return customers 

def generateMailingLabels(customerList): 
    """Sorts through the customer list and returns only females living in Iowa.""" 
    mailingList 
    for customer in customerList: 
     if customer[5] == 'IA' and customer[10] == 'female': 
      mailingList.write(customer) 

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

EDIT: ОБНОВЛЕНО КОД:

def main(): 
    """ Opens file, reads customer information into a list, closes the file""" 

    with (open('customerData.txt','r') as custFile, 
      open('mailingLabels.txt','w') as mailingList): 

     customerList = generateList(custFile) 
     generateMailingLabels(customerList, mailingList) 

     # Echo first and last enter from the customerList 
     print "customerList[0]:", customerList[0] 
     print "customerList[-1]:",customerList[-1] 

def generateList(custFile): 
    """ Reads customer data from file and returns a list of customers""" 
    customers = [] 
    for line in custFile: 
     # Strip the new-line character from the end of the line, then split 
     # the line on the commas (',') to get a list of customer fields 
     custInfoList = line.strip().split(',') 
     customers.append(custInfoList) 
    return customers 

def generateMailingLabels(customerList,mailingList): 
    """Sorts through the customer list and returns only females living in Iowa.""" 
    open('mailingLabels.txt','w') 

    for customer in customerList: 
     if customer[5] == 'IA' and customer[10] == 'female': 
      mailingList.write(customer) 

    mailingList.close() 

main() 
+1

Вероятно, вы должны вызвать 'generateMailingLabels' из' main'. И переместите оператор 'mailingList = open (...)' в 'generateMailingLabels'. – melpomene

ответ

0

определяются в функции main()mailingList, но generateMailingLabels не получает его. (Для одного, не похоже, вы не называть его)

Если добавить его в так что ваш основной выглядит больше как:

def main(): 
""" Opens file, reads customer information into a list, closes the file""" 

    custFile = open('customerData.txt','r') 
    customerList = generateList(custFile) 
    mailingList = open('mailingLabels.txt','w') 

    # Echo first and last enter from the customerList 
    print "customerList[0]:", customerList[0] 
    print "customerList[-1]:",customerList[-1] 

    custFile.close() 
    generateMailingLabels(customerList, mailingList) 

И обратите внимание на дополнительный параметр на generateMailingLabels - вы должны пройти ссылка на функцию тоже! След generateMailingLabels теперь становится def generateMailingLabels(customerList, mailingList), и вы можете удалить этот случайный mailingList, плавающий в первой строке.

EDIT: Также не забудьте закрыть рассылкуList где-нибудь. Из-за того, что лучше научиться просто использовать with Оператор- автоматически очищает все, что может работать как файл (обычно просто использовать его с файлами)

with (open('customerData.txt', 'r') as custFile, 
     open('mailingLabels.txt','w') as mailingList): 
    customerList = generateList(custFile) 
    generateMailingLabels(customerList, mailingList) 

И тогда он автоматически закрывается. В противном случае работает как любая другая структура блока.

+0

великие мысли думают одинаково. –

+0

@ touchmybody да, подумал, что мы должны научить ученика заявлениям, так как они волшебны. У меня возникло соблазн определить необходимые функции на моих классах, чтобы позволить мне использовать их для операторов тоже, но у меня слишком мало вещей, которые преходящи. – Delioth

+0

Я исправил вещи, о которых вы, ребята, рассказывали мне, однако я получаю синтаксическую ошибку в самом первом «как» сразу после того, как я начинаю с оператора. Кроме того, поскольку не было упоминания о цикле for в def generateMailingLabels (customerList, mailingList), что оно является правильным и должно функционировать по назначению? Я обновил свой код в своем исходном сообщении. – CFalco

0

Перед тем, как приступить к работе, я хотел бы отметить, что с Python, вы можете позволить интерпретатор обрабатывать открытие и закрытие потоков файла:

with open('customerData.txt','r') as custFile: 
    ## do some stuff here that requires the file to be open 
    doSomeStuff() 

## once outside the loop, Python closes the file for you 
doSomeMoreStuff() 

Хорошая вещь о with open(path, mode) as foo это нет никакой возможности вы забудете закрыть файл.


В вашей программе, есть ошибка в def generateMailingLabels(customerList):

Первая ошибка состоит в том, что вы даже не называя его из main() функции. Как функция будет запущена, если вы ее не назовете?

Следующая вещь, которую я вижу здесь:

mailingList 
for customer in customerList: 
    if customer[5] == 'IA' and customer[10] == 'female': 
     mailingList.write(customer) 

В питона, вы не можете объявить нераспределенные переменные. Строка, которая говорит, mailingList ничего не делает, кроме как выдает ошибку. Кроме того, вы вызываете mailingList.write(), даже если он не создан. Вам нужно открыть файл внутри этой функции или пройти в открывшемся mailingList в него. Я бы рекомендовал открыть его внутри этой функции вместо того, чтобы передавать его, но это зависит от вас.

0

Ваши комментарии в ваших методах должны иметь смысл и описывать, что делает этот метод. Например, комментарий к вашему методу generateMailingList не имеет ничего общего с тем, что делает этот метод.

Кроме того, поскольку вы используете Python, вы должны следовать style guide for Python при написании кода.

Вы также можете упростить свой код - в то же время сделать его более гибким, передав имена файлов методам, а не обработчикам файлов. Имейте в виду, что функция должна делать только одно: если функция выполняет два/три разных, это затрудняет отладку и изолирование проблем; не говоря уже о написании хороших тестов.

Итак, давайте начнем с трех вещей, ваша программа должна сделать:

  1. Прочитайте исходный файл
  2. отфильтровывать записи, соответствующие критери
  3. Написать результаты

Давайте начнем писать эти функции отдельно:

def read_records(filename, separator=','): 
    "This method reads the source CSV file and returns a list of records" 
    results = [] 
    with open(filename) as f: 
     for line in f: 
      if line.strip(): # skips blank lines 
       results.append(line.split(',')) 

    return results 

def filter_records(records): 
    gender = 'female' 
    state = 'IA' 
    results = [] 
    for record in records: 
     if record[5] == state and record[10] == gender: 
      results.append(record) 
    return results 

def write_results(filename, records): 
    "Writes out filtered records, with 5 spaces between each entry" 
    with open(filename, 'w') as f: 
     for record in records: 
      name = '{} {} {}'.format(record[0], record[1], record[2]) 
      address = '{}\n{}, {} {}'.format(record[3], record[4], record[5], record[6]) 
      f.write('{}\n{}\n\n\n\n\n'.format(name, address)) 

Далее, мы должны вызвать их в правильном порядке:

if __name__ == '__main__': 
    records = read_records('customerData.txt') 
    filtered_records = filter_records(records) 
    write_results('mailingLabels.txt', filtered_records) 
    print('Done') 

Есть некоторые места в коде, которые можно оптимизировать, в зависимости от того, что вы учили в классе.

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