2013-05-03 1 views
2

Мне было поручено создать программу на Python, которая ищет файл CSV; список научных работ (автор, год, название, журнал - это фактически TSV).Python - изменение вывода при запросе моего CSV-файла

С моим текущим кодом я могу добиться правильного вывода (как в правильной информации), но он не отформатирован правильно.

Что я получаю, это;

['Albers; Bergman', '1995', 'The audible Web', 'Proc. ACM CHI ']

Где мне нужен этот формат;

Автор/с. (Год). Заглавие. Journal.

Таким образом, запятые изменены для полных остановок (периодов). Также ; между авторами следует изменить на & знак, если есть два автора, или должна быть запятая , за которой следует & для трех или более авторов. I.E

Glenn & Freg. (1995). Классное название книги. Название эпического журнала.

или

Перри, Смит @ Джонс. (1998). Заголовок кулера. Скучное имя журнала.

Я не совсем уверен, как это сделать. Я искал ссылку на python, google и здесь, в Stackoverflow, но не мог найти ничего (что я понял, по крайней мере). Здесь есть ЛОТЬ, чтобы полностью удалить знаки препинания, но это не то, что мне нужно.

Сначала я подумал, что функция замены будет работать, но это дает мне эту ошибку. (Я оставлю код, чтобы показать, что я пытался, но закомментирована)

str.replace(',', '.') 
TypeError: replace() takes at least 2 arguments (1 given) 

Он не был бы полностью решить мою проблему, но я понял, что это что-то, чтобы перейти от. Я предполагаю, что str.replace() не примет пунктуацию?

В любом случае, ниже мой код. У кого-нибудь есть другие идеи?

import csv 


def TitleSearch(): 
    titleSearch = input("Please enter the Title (or part of the title). \n") 
    for row in everything: 
     title = row[2] 
     if title.find(titleSearch) != -1: 
      print (row) 


def AuthorSearch(): 
    authorSearch = input("Please type Author name (or part of the author name). \n") 
    for row in everything: 
     author = row[0] 
     if author.find(authorSearch) != -1: 
      #str.replace(',', '.') 
     print (row) 


def JournalSearch(): 
    journalSearch = input("Please type in a Journal (or part of the journal name). \n") 
    for row in everything: 
     journal = row[3] 
     if journal.find(journalSearch) != -1: 
      print (row) 

def YearSearch(): 
    yearSearch = input("Please type in the Year you wish to search. If you wish to search a decade, simply enter the first three numbers of the decade; i.e entering '199' will search for papers released in the 1990's.\n") 
    for row in everything: 
     year = row[1] 
     if year.find(yearSearch) != -1: 
      print (row) 




data = csv.reader (open('List.txt', 'rt'), delimiter='\t') 
everything = [] 
for row in data: 
    everything.append(row) 



while True: 
    searchOption = input("Enter A to search by Author. \nEnter J to search by Journal name.\nEnter T to search by Title name.\nEnter Y to search by Year.\nOr enter any other letter to exit.\nIf there are no matches, or you made a mistake at any point, you will simply be prompted to search again. \n") 

    if searchOption == 'A' or searchOption =='a': 
     AuthorSearch() 
     print('\n') 

    elif searchOption == 'J' or searchOption =='j': 
     JournalSearch() 
     print('\n') 

    elif searchOption == 'T' or searchOption =='t': 
     TitleSearch() 
     print('\n') 
    elif searchOption == 'Y' or searchOption =='y': 
     YearSearch() 
     print('\n') 
    else: 
     exit() 

Заранее благодарим любого, кто может помочь, это действительно оценено!

ответ

1

То, что вы получили до сих пор отличный старт; вам просто нужно обработать его немного дальше. Замените print(row) на PrettyPrintCitation(row) и добавьте функцию ниже.

В принципе, похоже, что вам нужно отформатировать авторов с помощью переключателя, который лучше всего реализовать как функцию. Затем вы можете справиться с остальными только с хорошей строкой формата.Предположим, что вашу ссылку rows выглядеть следующим образом:

references = [ 
    ['Albers', '1994', 'The audible Internet', 'Proc. ACM CHI'], 
    ['Albers;Bergman', '1995', 'The audible Web', 'Proc. ACM CHI'], 
    ['Glenn;Freg', '1995', 'Cool book title', 'Epic journal title'], 
    ['Perry;Smith;Jones', '1998', 'Cooler book title', 'Boring journal name'] 
] 

Тогда следующий даст вам то, что я считаю, что вы ищете:

def PrettyPrintCitation(row) : 
    def adjustauthors(s): 
     authorlist = s[0].split(';') 
     if(len(authorlist)<2) : 
      s[0] = authorlist[0] 
     elif(len(authorlist)==2) : 
      s[0] = '{0} & {1}'.format(*authorlist) 
     else : 
      s[0] = ', '.join(authorlist[:-1]) + ', & ' + authorlist[-1] 
     return s 

    print('{0}. ({1}). {2}. {3}.'.format(*adjustauthors(row))) 

применяется к выше цитатах, это дает

Albers. (1994). The audible Internet. Proc. ACM CHI. 
Albers & Bergman. (1995). The audible Web. Proc. ACM CHI. 
Glenn & Freg. (1995). Cool book title. Epic journal title. 
Perry, Smith, & Jones. (1998). Cooler book title. Boring journal name. 

(Я предполагаю, что «@» в вашем предлагаемом выходе было ошибкой ...)

+1

Большое спасибо за твою помощь, это прекрасно сказано! –

0

Вам нужно работать над вашим синтаксисом python.

попробовать что-то вдоль этих линий:

authorlist=row[0].split(';') # split the multiple authors on semicolon 
authors=" & ".join(ahthorlist) # now join them together with ampersand 
print"""%s. (%s) %s.""" % (authorlist,row[1],row[2]) # print with pretty brackets etc. 

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

  • Нет связанных вопросов^_^