【问题标题】:Formatting a file into markdown file将文件格式化为markdown文件
【发布时间】:2017-05-03 20:55:05
【问题描述】:

由于必要,我将许多文件的内容转储到一个文件中,如下所示:

Filename=A1.cpp
Description=A1 CPP
Listen=/var/run/A1.cpp
Filename=A2.cpp
Description=A2 CPP
Listen=/var/run/A2.cpp
Write=/home/folder/textfile

您可能会发现,键会重复自己。但是,也有一些例外。可能有共同的钥匙和不同的钥匙。 目标是这样的:

| Filename |   Description  | Listen         |         Write         |
| A1.cpp   |     A1 CPP     | var/run/A1.cpp |           -           |
| A2.cpp   |     A2 CPP     | var/run/A2.cpp | /home/folder/textfile |

您可能会发现输出是 md 格式。 我对 Python(3) 相当陌生。 我脑海中的问题可以这样排列;

  • 如何通过= 进行拆分? (我尝试过使用正则表达式,但有很多情况我无法处理,例如空格、标点符号……)

  • 我应该如何存储它们以获得给定的输出? (字典,二维数组;总是以文件名开头)

附:为了简洁起见,我展示了我的问题的过度简化版本。

【问题讨论】:

  • 我们可以说每条记录都以“文件名=”开头吗?只有这 4 个键/值对吗?如果有空格和标点符号之类的问题……你还没有展示出来,所以很难猜出你想要什么。
  • md 格式...哪一种?什么是“钥匙”?你做了哪些尝试?
  • 是的,每条记录都以 Filename=... 开头,通过“=”分隔的目的取决于将来使用的灵活性。因为列名不仅限于四个,还会添加未知的列名。不过,由于这个原因,我无法对先前尝试的列名进行硬编码。
  • 给定的格式 -bar 分隔 - 可以转换成 Markdown 文件。尝试从硬编码版本开始,因为键(列名)在常用键之上动态变化,我无法通过这种方法处理它们。我试图通过'='来划分左右手,有太多例外,然后我决定问;有没有办法以更聪明的方式处理这种情况。

标签: regex python-3.x data-structures split formatting


【解决方案1】:

只是玩弄正则表达式和pandas,这可能会让你开始:

import re, pandas as pd

string = """
Filename=A1.cpp
Description=A1 CPP
Listen=/var/run/A1.cpp
Filename=A2.cpp
Description=A2 CPP
Listen=/var/run/A2.cpp
Write=/home/folder/textfile
"""

# regex for your structure
rx = re.compile(r"""
        ^                                     # start of line
        Filename=(?P<filename>.+)[\n\r]       # Filename
        Description=(?P<description>.+)[\n\r] # Description
        Listen=(?P<listen>.+)[\n\r]           # Listen
        (?:Write=(?P<write>.+)[\n\r])?        # Write, optional
        """, re.VERBOSE | re.MULTILINE)

# column labels
labels = ['Filename', 'Description', 'Listen', 'Write']
rows = [match.groups() for match in rx.finditer(string)]

# formatter for the columns
mdformat = lambda x: '{} |'.format(x)

# create the dataframe
df = pd.DataFrame.from_records(rows, columns=labels)
df.fillna('-', inplace = True)

# print it out using the mdformat function
print(df.to_string(index=False, header = False,
        formatters={'Filename': mdformat, 'Description': mdformat, 
                    'Listen': mdformat, 'Write': mdformat}))


这产生
A1.cpp |  A1 CPP |  /var/run/A1.cpp |                      - |
A2.cpp |  A2 CPP |  /var/run/A2.cpp |  /home/folder/textfile |


因此,基本上代码会扫描您的字符串,将结果放入列表中并从中创建一个pandas 数据框。这是使用格式化程序功能打印出来的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2020-11-18
    • 2012-01-09
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多