【问题标题】:need help parsing a complicated text file需要帮助解析复杂的文本文件
【发布时间】:2020-09-05 17:04:08
【问题描述】:

我有一个结构如下所示的文本文件,我想使用 python 提取数据框中的数据。数据框应具有 PMID 以及针对每个 PMID 的作者出现的所有文本。

数据格式

PMID- 唯一的 8 位数字
xyz - 文本(可能是多行)
xyz- 文本(可能是多行)
AUTHOR-文本(可能是多行)
作者- 文本(可能是多行)

PMID- 唯一的 8 位数字
xyz - 文本(可能是多行)
xyz- 文本(可能是多行)
AUTHOR-文本(可能是多行)
AUTHOR-文本(可能是多行)

我在 python 中尝试过的代码如下 - 我能够提取所有 PMID,但我无法弄清楚将所有作者文本附加到每个 PMID 的逻辑。

for lines in open('pubmed-cancerbiol.txt','r'):
    if(lines[0:4] == 'PMID'):
        print(lines)

【问题讨论】:

  • 请用您尝试过的代码更新您的问题。
  • 对不起,更新了我目前使用的代码,我更多的是在寻找一些关于逻辑的指导。一旦我得到逻辑,我就可以弄清楚代码。

标签: python dataframe data-processing


【解决方案1】:

您可以使用以PMID 作为键、AUTHORs 作为值的字典中的数据收集。

假设你从文件开始

from io import StringIO
fo = StringIO(
'''PMID- 12345678
xyz - text (might be multiple lines)
xyz- text (might be multiple lines)
AUTHOR- author1
AUTHOR- author2

PMID- 12345679
xyz - text (might be multiple lines)
xyz- text (might be multiple lines)
AUTHOR- author3
AUTHOR- author4''')
    
# with open(filename, 'r') as fo:

然后迭代行并填充字典

records = dict()
pmid = None
for line in fo.readlines():
    if line.startswith('PMID-'):
        pmid = line.split('-')[-1].strip()
        records[pmid] = []
    elif line.startswith('AUTHOR'):
        records[pmid].append(line.split('-')[-1].strip())

创建数据框时,您可以 df = pd.DataFrame(records) 将每个作者放在一列中或在传递给数据框构造函数之前加入列表

df = pd.DataFrame(
    [', '.join(r) for r in records.values()],
    index=records.keys()
)

输出

                         0
12345678  author1, author2
12345679  author3, author4

【讨论】:

  • @Bharath 谢谢,请习惯于提供有意义且易于粘贴到代码中的数据样本
  • 当然,Richie,我会记住这一点,事实上,我正在阅读如何重现错误并以更有意义的方式提出问题。希望下次我能够以更好的方式提出问题。再次感谢您对我的查询的指导和帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多