【问题标题】:Converting a somewhat organized text file to csv using python?使用 python 将有组织的文本文件转换为 csv?
【发布时间】:2020-10-16 18:30:36
【问题描述】:

我需要将文本文件转换为 csv 并按列组织。但是,我在文本文件中的数据是按行排列的,长 715 页。下面是文本文件的示例:

这是我的数据的示例,但实际上每个人的信息要多得多,并且有数千个条目。

基本上,每一行都用“------”分隔。但是,行之间的数据是多行的。例如,将有 --- 然后是姓名和年龄在下一行,然后是薪水,然后是另一个 --- 表示新条目的开始。

有没有一种方法可以让我以某种方式解决这种奇怪的数据布局,最终得到一个包含姓名、年龄、职业、薪水等列的 csv。我将使用 python。我在想,是否有可能用每个新行之前的 ---- 符号来分割它?我不知道该怎么做,而且我是初学者。或者如果 python 可能不是最好的方法,那是什么?

【问题讨论】:

  • 请将您拥有的文件中的文本作为图像包含为实际文本。
  • 在问题中将示例作为文本发布到此处,以便我们可以复制/粘贴。是的,您可以使用破折号来分解数据。我可能会为此转向itertools.groupby。您可以使用它为破折号之间的线创建子迭代器。我会专注于将文件转换为列表,稍后再做pandas 的事情。
  • 欢迎来到 Stack Overflow!请拨打tour,阅读what's on-topic hereHow to Ask,并提供minimal reproducible example。 “为我实现此功能”与此站点无关。您必须做出诚实的尝试,然后针对您的算法或技术提出具体问题。
  • 除非绝对必要,否则不要使用图片。

标签: python pandas csv text


【解决方案1】:

您可以使用itertools.groupby 创建在虚线和非虚线之间交替的子迭代器。现在非破折号迭代器只是文本块。假设这些字段由至少一个制表符或多个空格字符分隔,正则表达式可以将它们分割。

import itertools

def get_my_data(filename):
    data = []
    with open(filename) as fileobj:
        for is_dash, block_iter in itertools.groupby(
                fileobj, lambda line: line.startswith("------")):
            if not is_dash:
                row = []
                for line in block_iter:
                    cols = [cell.strip() for cell in
                        re.split(r"\t+|\s{2,}", line)]
                    row.extend(cols)
                if row:
                    data.append(row)

【讨论】:

  • 我可以用什么样的表达来瓜分它?另外,我如何查看最终产品的外观?
  • 我使用了一个正则表达式r"\t+|\s{2,}",它使用一个或多个制表符,或者一行中的任意 2 个或多个空格将每一行分割成多个部分。这只是一个猜测,因为我不知道您的数据中真正使用了什么。
猜你喜欢
  • 1970-01-01
  • 2017-11-05
  • 2023-03-28
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 2016-01-07
  • 1970-01-01
相关资源
最近更新 更多