【问题标题】:Extracting specific data from multiple text files and writing them into columns in csv从多个文本文件中提取特定数据并将它们写入 csv 中的列
【发布时间】:2022-01-29 21:33:23
【问题描述】:

我正在尝试编写一个代码,该代码将从多个报告文件中搜索特定数据,并将它们写入单个 csv 的列中。

我正在寻找的报告文件行并不总是在同一行,所以我正在寻找与以下行相关的数据:

估计文件:pog_example.bef

估计 ID:o1_p1

估计为 61078 (100.0%)。

我想将每个文本文件中的数据写入 csv 中的列,如下所示:

example.bef, o1_p1, 61078 (100.0%) 估计

到目前为止,我有这个脚本,它将列出我的第一个条件,但我不知道如何循环它以找到我的第二行和第三行来填充第二列和第三列

from glob import glob
import fileinput
import csv

with open('percentage_estimated.csv', 'w', newline='') as est_report:
    writer = csv.writer(est_report)
    for line in fileinput.input(glob('*.bef*')):

        if 'Estimate file' in line:
            writer.writerow([line.split('pog_')[1].strip()]) 

我对 python 很陌生,所以任何帮助都将不胜感激!

【问题讨论】:

  • 三个值是否都在同一个文件的不同行上?你能格式化你的问题,并添加一些其他数据,让它看起来更像它实际上吗?

标签: python csv


【解决方案1】:

我想我明白你在做什么,但我不确定。

我认为您的 BEF 文件可能如下所示:

a line
another line
Estimate file: pog_example.bef
Estimate ID: o1_p1
61078 (100.0%) estimated.
still more lines

如果是这样,那么一旦找到带有'Estimate file' 的行,您就需要从 for 循环中控制并开始手动迭代这些行,因为您知道将出现哪些行。

这是一个非常简单的示例脚本,它打开我的模拟 BEF 文件(上图)并自动迭代行直到找到 'Estimate file'。从那里它专门处理每一行,使用next(bef_file) 迭代到下一行,期望它们具有正确的文本:

import csv

all_rows = []

bef_file = open('input.bef')
for line in bef_file:
    if 'Estimate file' in line:
        fname = line.split('pog_')[1].strip()

        line = next(bef_file)
        est_id = line.split('Estimate ID:')[1].strip()

        line = next(bef_file)
        value = line.strip()

        row = [fname, est_id, value]
        all_rows.append(row)
        break  # stop iterating lines in this file

csv_out = open('output.csv', 'w', newline='')
writer = csv.writer(csv_out)
writer.writerow(['File name', 'Est ID', 'Est Value'])
writer.writerows(all_rows)

当我运行时,我得到了 output.csv

File name,Est ID,Est Value
example.bef,o1_p1,61078 (100.0%) estimated.

如果您关心的行之间的数据中有空行,请使用next(bef_file) 语句手动跳过它们。

【讨论】:

  • 谢谢,但我遇到的问题是写第二列和第三列,所以我希望将“估计 ID”信息写入第 2 列,并列出“估计”信息第 3 列
  • @Mirry610,刚刚解决了一点。您需要尝试更多地处理该行。在 SO 上搜索“提取文本/字符串”之类的内容,如果找不到任何内容,请提出另一个问题。
  • 哦,现在我知道你在用pog_ 做什么了,只是获取文件名的一部分。
  • 是的,pog_ 部分只是为了整理。我的问题是我试图写入列的 3 个项目来自报告文件中的不同行。我可以将第一个 if 语句写入第一列,但我需要迭代其他 if 语句以找到“Estimate ID”和“Value”的行,然后将它们填充到第 2 列和第 3 列中
  • 看起来很有希望。看起来它需要一些按摩才能让它为我工作,我现在没时间了,但同时感谢你的帮助!当我开始工作时会更新
【解决方案2】:

如果有人想看看最终对我有用的是什么

from glob import glob
import csv

all_rows = []

with open('percentage_estimated.csv', 'w', newline='') as bef_report:
    writer = csv.writer(bef_report)
    writer.writerow(['File name', 'Est ID', 'Est Value'])
    for file in glob('*.bef*'):
        with open(file,'r') as f:
            for line in f:
                if 'Estimate file' in line:
                    fname = line.split('pog_')[1].strip()
                    line = next(f)
                    est_id = line.split('Estimate ID:')[1].strip()
                    line = next(f)
                    line = next(f)
                    line = next(f)
                    line = next(f)
                    line = next(f)
                    line = next(f)
                    line = next(f)
                    value = line.strip()
                    row = [fname, est_id, value]
                    all_rows.append(row)
                    break  
            writer.writerows(all_rows)

【讨论】:

  • 干得好,很高兴看到你成功了。
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 2012-07-25
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2017-07-14
相关资源
最近更新 更多