python - 在 Python 中从(字符串)元组写入 csv

标签 python regex string python-3.x csv

为了了解我当前的问题,以下是有关更广泛问题的一些背景信息:

我有一个由多个文档组成的大型文本文件。我需要找到一种方法将该文件组织成其组成部分。不幸的是,所有单独的文档都有不同的格式,它们之间唯一的共同点是每个文档的头部都包含日期,每次都以相同的格式编写: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 时,某些行完全没问题。但有些输出变得困惑——文本被分成看似随机的 block ,并且有空白行、句子片段行。这样的情况有数百起。当我回顾原始文档并找到句子中断的相应位置时,我看不到文本本身有任何特殊或独特之处。没有特殊字符。这只是纯文本。但是,它们似乎确实是特别长的文本部分,因此我想知道 CSV 文件中的单个单元格可以包含的信息量是否存在限制。

我的问题是:为什么 CSV 输出在某些地方如此时髦,而在其他地方却不然?每个单元格中可以放入的文本数量是否有限制?

Image of csv file

最佳答案

您没有提供足够的信息来识别问题,但 Excel 在读取带有嵌入换行符的 CSV 单元格时往往会出现问题,所以我的第一个猜测是,这就是问题所在:您有一个带有嵌入换行符的 csv,它csvwriter 可能以可逆方式写入,但 Excel 无法正确解析。

换句话说,您的 CSV 文件可能没有任何问题;只是按照将其读入 Excel 的方式进行操作。您没有说明如何确定存在问题。

如果您的目标是生成 Excel 可以读取的内容,我会放弃 CSV 格式,直接使用电子表格。模块openpyxl可以生成xlsx文档,效果很好。

关于python - 在 Python 中从(字符串)元组写入 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37215675/

相关文章:

python - 我需要 Selenium 以更大的分辨率打开它的网络浏览器(最好是最大化)

python - 升级到 GAE3 时替换 google.appengine.api 导入模块

python - Python 中的命名反向引用 (?P=name) 问题重新

javascript - 使用连接历史记录 api 回退进行 url 重写

java - 将 int 输入解析为 char

python - 在 Python 中匹配 2 个正则表达式

python - 我想将列表拆分为两个列表 right_order[] 和 reverse_order[],同时比较列表中的项目

regex - 在 "> 和 </pattern 中提取字符串

java - 使用字符串作为参数的问题

json - 如何将长JSON值字符串编码为多行?