使用 Python 和正则表达式来搜索包含特定单词的行,然后将这些行附加到 CSV 列标题

问题描述 投票:0回答:1

我有一个名为“maps.txt”的长文本文件。它包含分为多个部分的大量数据。每个部分都有自己的标题:

measured burnup - core  140828~a
*a bunch of data*

channel averaged  cell avg  fast fluxes   core 000124~a  k-eff: 1.028343 scale = 1e+14
*a bunch of data*

channel averaged  boundary  fast fluxes   core 000124~a  k-eff: 1.028343 scale = 1e+14
*a bunch of data*

scan 170210 fission power at tpd 223207.8   total power  112.210
*a bunch of data*

我想创建一个 Python 脚本来遍历文件,使用正则表达式搜索标题中的单词,然后将该标题复制到 CSV 文件以用作列标题:

import re
import csv

outputFilename = Sitename + '_' + datetime.now().strftime('%Y%m%d__%H_%M_%S')
with open(outputFilename + '_output.csv', 'w') as outputCSV:
    search_titles = re.compile('channel|scan|measured')
    for i, line in enumerate(open('maps.txt', 'r')):
        for match in re.finditer(search_titles, line):
                writer = csv.writer(outputCSV).writerow(line)

这似乎可以很好地从每个数据部分搜索标题,但它无法正确输出到 CSV 文件。相反,每个标题中的每个字母都有自己的单元格(我在 Excel 中打开 CSV 文件),并且不会将它们打印在 CSV 文件的顶行(我希望将它们设为列标题)。相反,它返回并在下一行打印。

最终我想截断标题,只保留一行列标题,例如:

| measured burnup | channel averaged cell avg fast fluxes |  channel averaged  boundary  fast fluxes  |  scan 170210 fission power at tpd  |

但是由于每个标题的长度不同,我不知道该怎么做。

python regex export-to-csv
1个回答
0
投票

您获得单字符行的原因是由于这一行:

writer = csv.writer(outputCSV).writerow(line)

writerow
需要“可迭代的字符串”,但您传递给它的是单个字符串,因此它会将其隐式转换为列表,这会导致字符串被拆分为单个字符。

相反,您需要将所有标头累积到一个列表中,并在读取完输入后将其写入文件:

with open(outputFilename + '_output.csv', 'w') as outputCSV:
    writer = csv.writer(outputCSV)
    search_titles = re.compile('channel|scan|measured')
    column_headings = []
    for line in open('maps.txt', 'r'):
        if search_titles.match(line):
            column_headings.append(line.strip())
    writer.writerow(column_headings)

请注意,由于您不使用行号,因此不需要

enumerate

在删除列名称中不必要的部分方面,您需要找出相关的内容并仅匹配该部分。例如,给定您的示例数据,您可以使用正则表达式,例如:

^(?:channel.*?(?=\s+core)|scan.*tpd|measured.*?(?=\s+-\s+core))

然后将代码修改为

search
而不是
match
:

with open(outputFilename + '_output.csv', 'w') as outputCSV:
    writer = csv.writer(outputCSV)
    search_titles = re.compile('^(?:channel.*?(?=\s+core)|scan.*tpd|measured.*?(?=\s+-\s+core))')
    column_headings = []
    for line in open('maps.txt', 'r'):
        m = search_titles.search(line)
        if m is not None:
            column_headings.append(m.group())
    writer.writerow(column_headings)

对于您的示例数据,这给出了一行:

measured burnup,channel averaged  cell avg  fast fluxes,channel averaged  boundary  fast fluxes,scan 170210 fission power at tpd
© www.soinside.com 2019 - 2024. All rights reserved.