我有一个名为“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 |
但是由于每个标题的长度不同,我不知道该怎么做。
您获得单字符行的原因是由于这一行:
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