2016-05-13 3 views
1

Чтобы понять мою текущую проблему, вот некоторая вводная информация о более широкой проблеме:Запись в формате CSV из кортежа (строки) в Python

У меня есть большой текстовый файл, состоящий из нескольких документов. Мне нужно было найти способ организовать этот файл в его составные компоненты. К сожалению, все отдельные документы имели разные форматы, и единственной среди них был тот факт, что руководитель каждого документа включал дату, написанную в том же формате каждый раз: dd MONTH yyyy. Я использовал даты в качестве книг, чтобы изолировать текст между ними.

#the date pattern with positive lookbehind 
bookend_1 = "(?<=\d{1,2}\sJANUARY\s\d{4}|\d{1,2}\sFEBRUARY\s\d{4}|\d{1,2}\sMARCH\s\d{4}|\d{1,2}\sAPRIL\s\d{4}|\d{1,2}\sMAY\s\d{4}|\d{1,2}\sJUNE\s\d{4}|\d{1,2}\sJULY\s\d{4}|\d{1,2}\sAUGUST\s\d{4}|\d{1,2}\sSEPTEMBER\s\d{4}|\d{1,2}\sOCTOBER\s\d{4}|\d{1,2}\sNOVEMBER\s\d{4}|\d{1,2}\sDECEMBER\s\d)" 

#The date pattern with positive lookahead 
bookend_2 = "(?=\d{1,2}\sJANUARY\s\d{4}|\d{1,2}\sFEBRUARY\s\d{4}|\d{1,2}\sMARCH\s\d{4}|\d{1,2}\sAPRIL\s\d{4}|\d{1,2}\sMAY\s\d{4}|\d{1,2}\sJUNE\s\d{4}|\d{1,2}\sJULY\s\d{4}|\d{1,2}\sAUGUST\s\d{4}|\d{1,2}\sSEPTEMBER\s\d{4}|\d{1,2}\sOCTOBER\s\d{4}|\d{1,2}\sNOVEMBER\s\d{4}|\d{1,2}\sDECEMBER\s\d)" 

#using the bookends to find the text in between dates 
docs = regex.findall(bookend_1+'(.*?)'+ bookend_2, psc_comm_raw, re.DOTALL|re.MULTILINE) 

Использование регулярных выражений, я создал два списка: один из всех дат, один из всех отрывков текста, которые произошли между датами. Я закрепил эти списки в кортеж. Я не мог закрепить их в словаре, потому что некоторые даты повторяются.

psc_comm_tuple = list(zip(date, docs)) 

Вот несколько строк psc_comm_tuple.

[('27 JULY 2004', 
    ' ADDIS ABABA, ETHIOPIA\n\nPSC/PR/Comm.(XIII)\n\nCOMMUNIQUÉ\n\nPSC/PR/Comm.(XIII) Page l\n\nCOMMUNIQUÉ OF THE THIRTEENTH MEETING OF THE PEACE AND SECURITY COUNCIL\n\nThe Peace and Security Council (PSC) of the African Union (AU), at its thirteenth meeting, held on 27 July 2004, adopted the following communiqué on the crisis in the Darfur region of the Sudan:\n\nCouncil,\n\n1.\tReiterates its deep concern over the grave situation that still prevails in the Darfur region of the Sudan, in particular the continued attacks by the Janjaweed militia against the civilian population, as well as other human rights abuses and the humanitarian crisis;\n\n2.\tUnderlines the urgent need to implement decision AU/Dec.54(111) on Darfur, adopted by the 3rd Ordinary Session of the Assembly...'), 
('29 JANUARY 2001', 
    '\n\nThe Central Organ of the OAU Mechanism for Conflict Prevention, Management and Resolution held its seventy-third * ordinary session at the level of Ambassadors on 29 January 2001, in Addis Ababa. The session was chaired by Ambassador Kati Ohara Korga, Permanent Representative of Togo to the OAU.\n\nHaving considered the Report of the Secretary General on the Democratic Republic of the Congo (DRC) and the situation in that country, the Central Organ:\n\n1.\tstrongly condemns the assassination of Pre...'), 
('20 MARCH 2001', 
    "\n\nThe Central Organ of the OAU Mechanism for Conflict Prevention, Management and Resolution held its 74th ordinary session at ambassadorial level, in Addis Ababa, Ethiopia, on Tuesday March 20, 2001. The session was chaired by Ambassador Ohara Korga, Permanent representative of Togo to the OAU....'), 
('22 AUGUST 2001', 
    '\n\nThe Central Organ of the OAU Mechanism for Conflict Prevention, Management and Resolution held its 75th Ordinary Session at Ambassadorial level in Addis Ababa, Ethiopia, on Wednesday 22 August 2001....')...] 

Моя конечная цель заключается в создании CSV с двумя колонками: один для даты, другое для тела текста, связанного с этой датой.

import csv 
import os 

with open('psc_comm.csv','w') as out: 
    csv_out=csv.writer(out) 
    csv_out.writerow(['date','text']) 
    for row in psc_comm_tuple: 
     csv_out.writerow(row) 

Когда я пишу вывод кортежа в csv, некоторые из строк полностью прекрасны. Но некоторые из выходных данных выглядят неустойчиво - текст разбит на кажущиеся случайными фрагменты, а также есть пустые строки, строки фрагментов предложения. Есть сотни таких случаев. Когда я оглядываюсь назад на исходный документ и нахожу соответствующие места, где нарушаются предложения, я не вижу ничего особенного или уникального в самом тексте. Нет специальных символов. Это просто текст. Тем не менее, они кажутся особенно длинными разделами текста, поэтому мне интересно, существует ли ограничение на количество информации, которую может содержать одна ячейка в файле CSV.

Мой вопрос: почему CSV-выход настолько забавен в некоторых местах, но не в других? Есть ли предел того, сколько текста вы можете поместить в каждую ячейку?

Image of csv file

+1

Существует ли ограничение на количество текста, которое вы можете видеть в своей таблице, возможно ли, что в вашей программе excel отключена связка? что, если вы откроете его в виде обычного текста? –

+1

Добро пожаловать в stackoveflow, @chickpeaze. Хорошая попытка передать вашу проблему в Интернете, но вы * далеко * скорее получите помощь, если сможете сузить свою проблему _a lot._ По крайней мере, приведите примеры данных, с которыми имеете дело: * * Измените свой вопрос ** и добавьте несколько строк из 'psc_comm_tuple'. – alexis

+0

также возможно, что 'csv.writer' пытается добавить символы escape-символов в символы, которые нарушали бы формат (например, запятую), и ваша программа не интерпретировала его так, как это предполагалось 'csv.writer'. –

ответ

1

Вы не дают достаточно информации, чтобы определить проблему, но Excel, как правило, имеют проблемы с чтением ячеек CSV с вложенными символами новой строки, так что мое первое предположение, что именно там, где это происходит не так: У вас есть csv со встроенными новыми строками, которые csvwriter может записывать обратимым образом, но Excel не разбирается правильно.

Другими словами, возможно, что нет ничего плохого в вашем файле CSV; просто так, как он читается в Excel. Вы не говорите, как вы устанавливаете, что есть проблема.

Если ваша цель - сгенерировать что-то, что может читать Excel, я бы обойтись без CSV-формата и перейти прямо к электронной таблице. Модуль openpyxl может генерировать документы xlsx и отлично работает.

+0

Вы были совершенно правы - проблема была в Excel. Я открыл файл csv в textedit, и записи проблем были на самом деле полностью прекрасными. Большое спасибо! – chickpeaze

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