python 如何正确格式化行和列在Excel工作表中导出的解析项目在.txt文件?

htrmnn0y  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(128)

我尝试使用由.txt文件中特定的、重复出现的文本块组成的数据创建Excel工作表,并忽略文件中的所有其他数据(目录等)。文本块的格式如此处所示,但我在最终Excel工作表的输出中遇到了两个不同的问题。
项目名称
状态:状态项目
类别:类别项目
子类别:子类别项目
日期:年月日
频率:频率项目
语言:语言项目
说明:描述文字
目前,我的代码使用的是一个字典,它是通过搜索一个块模式,将其插入到一个数据框(Pandas)中,然后导出到excel中。然而,我遇到的问题是,它为文本块中的每一行创建一个新行,而不是为每个块创建一个新行。如下所示:
Excel sheet with extra rows
如何使用阻止模式来防止这种情况?
第二个问题是顶层项(“ITEMNAME”)的格式不一样,因为它没有一个“键”可以在字典中使用。我如何将它包含在块模式中,以添加到字典中,并以不同的格式导出?
下面是我的代码。

import pandas as pd
import re

txtFilePath = r'/test.txt'

with open(txtFilePath, 'r') as f:
    text = f.read()

# define pattern for block search - first method
block_pattern = re.compile(r"^(?:Status|Event Category|Event Sub-Category|"
                           r"Added Date|Update Frequency|Language|Description):.+$",
                           re.MULTILINE)

# find all blocks that match the pattern
blocks = block_pattern.findall(text)

df = pd.DataFrame()

# iterate over blocks and extract patterns
for block in blocks:
    # split blocks on individual lines
    lines = block.strip().split("\n")
    # dict to store items for this block
    item_dict = {}

    # iterate to find type and values
    for line in lines:
        item_parts = line.strip().split(":", 1)
        item_type = item_parts[0].strip()
        item_value = item_parts[1].strip()

        # add item to dict
        item_dict[item_type] = item_value

    df = df.append(item_dict, ignore_index=True)

# print(df)
df.to_excel(r'/text.xlsx')

我已经尝试了两次对append行的更改来修复额外的行。
第一次变更:df.loc[0] = df.append(item_dict, ignore_index=True),但它会给出以下错误:
ValueError:无法设置列不匹配的行
第二次变更:df.loc[0] = item_dict此更改将创建列,但不从字典中导入数据。Excel工作表只包含列。
提前感谢您的帮助。

编辑

示例文本:
机构123
状态:生产
事件类别:新闻资讯
事件子类别:不适用
添加日期:2017年5月10日
更新频率:每周
语言:英语
说明:地方金融机构
Desired Result

qcuzuvrc

qcuzuvrc1#

下面是使用pandas.Series.str.splitpandas.DataFrame.transpose的方法。
试试这个:

import pandas as pd

df = pd.read_csv(txtFilePath, header=None)
​
df = (
       df
        [0].str.split(":", expand=True)
        .set_index(0)
        .transpose() # <-- long to wide
        .assign(Name= df.iloc[0,0])
        .pipe(lambda x: x.reindex(columns= ["Name"] + x.columns.tolist()[:-1]))
      )
#输出:
print(df.to_string())

0             Name Institution 123       Status Event Category Event Sub-Category  Added Date Update Frequency  Language                   Description
1  Institution 123            None   Production           News                N/A   5/10/2017           Weekly   English   Local financial institution

最后,要生成Excel电子表格,可以添加df.to_excel(r"/text.xlsx")

相关问题