【问题标题】:Extract specific lines from text files using Python使用 Python 从文本文件中提取特定行
【发布时间】:2018-03-27 10:19:00
【问题描述】:

您好,请参阅之前已解决帖子的链接。

Copy specific lines from text files into excel

此 VBA 代码允许我打开文件夹中的所有文本文件并将特定行加载到 Excel 电子表格中。

但是,我现在正在处理更大的文件和更多的文件。使用 VBA 不再是一种选择,因为它花费的时间太长,而且数据限制如何。

我想知道是否有任何现有的 python 代码可以从每个数据文件中提取特定行,并将其保存为新文档或将自身保存为其当前文件名。

示例代码:

DATASET UNSTRUCTURED_GRID
POINTS 5 float
0.096853 0.000000 0.111997
0.096853 -0.003500 0.111997
0.096890 0.000000 0.084015
0.096853 -0.003500 0.111997
0.096890 -0.003500 0.084015
CELL_DATA 5
SCALARS pressure float 1
LOOKUP_TABLE default
-0.000000
-0.000000
-3.000000
-2.000000
-6.000000

对此的任何提示将不胜感激。谢谢, 乔恩

【问题讨论】:

  • 一小部分数据可能对解决问题很有帮助。
  • 你好 Evgeny,我已经在问题中添加了一个示例。谢谢
  • ...而您尝试提取/省略的数据是...
  • 对不起,我要提取的数据是压力值,所以在这种情况下是最后 5 行。

标签: python bigdata text-files extract


【解决方案1】:

可以试试这个:

# use python 3.6
from pathlib import Path 

txt_file_content = """DATASET UNSTRUCTURED_GRID
POINTS 5 float
0.096853 0.000000 0.111997
0.096853 -0.003500 0.111997
0.096890 0.000000 0.084015
0.096853 -0.003500 0.111997
0.096890 -0.003500 0.084015
CELL_DATA 5
SCALARS pressure float 1
LOOKUP_TABLE default
-0.000000
-0.000000
-3.000000
-2.000000
-6.000000"""

# creating sample file
Path('sample.txt').write_text(txt_file_content)

上面的代码创建了一个示例文件,然后解析它:

# read a file back, itrate over many files if needed
doc = Path('sample.txt').read_text()

# NOTE:
# you can walk over *.txt files in specific fodler with 
# https://docs.python.org/3/library/glob.html#glob.glob


# assume the disired text block is 
#   (1) always after 'LOOKUP_TABLE default'
#   (2) at the end of txt file
last_text_segment = doc.split('LOOKUP_TABLE default')[1]

values = [float(x) for x in last_text_segment.split('\n') if x]

# alternatively as a function:

def extract_pressure(filename):
    doc = Path(filename).read_text()
    last_text_segment = doc.split('LOOKUP_TABLE default')[1]
    return [float(x) for x in last_text_segment.split('\n') if x]

您可能希望将数据组装到 pandas 数据帧中,以便对其进行进一步的数字运算。

【讨论】:

  • 感谢 Evgeny 提供这段代码,这对我开始有很大帮助。我只需要调整它,因为压力值并不总是在 txt 文件的末尾。我现在还将查看“glob”以尝试对文件夹中的所有文件执行此操作。非常感谢!
  • 您可以根据您拥有的数据考虑如何提取值的预代码/算法。一种更通用的方法是将文本文件分割成带有标题和正文的块,然后评估所需的块在标题中包含标记文本。我在这里使用这种方法:github.com/mini-kep/parser-rosstat-kep/blob/dev/src/kep/csv2df/…,但代码有点复杂,你可能需要更简单的东西。如果有用,请随意标记为已接受的答案。
  • glob 案例也在建议的链接中单击:*.com/questions/3964681/…
【解决方案2】:

试试这个:

counter=0
with open(filename, 'w') as infile:
    for line in infile:
            counter+=1
            if line.split(' ')[0]=='CELL_DATA':
            i=counter+3
            j=line.split(' ')[1]+1
            break

这部分找到您应该开始检索数据的行。然后你可以对数据做任何你喜欢的事情。例如:

data=[]
for line in infile[i:i+j]:
    data.append(line)

并将数据保存在某处只需使用 python 选项写入 excel 或任何其他文件。 祝你好运!

【讨论】:

  • 您好 Lior,感谢您的评论。我已经在问题中添加了一些示例数据。这是我试图从每个文件中选择的压力值。我的问题是我有大约 10,000 个文件要执行此操作,因此试图找到最佳(最快)方法。
  • 您感兴趣的数据会始终遵循相同的字符串吗? (即'LOOKUP_TABLE default'?)这个字符串是唯一的还是在每个文件中出现多次?
  • 'LOOKUP_TABLE default' 可以出现多次。 'LOOKUP_TABLE default' 字符串上方的字符串“SCALARS pressure float 1”是压力值之上的唯一值。我还应该说压力值并不总是在文本文件的最后。谢谢
  • 字符串“CELL_DATA”旁边的数字指定存在的压力值的数量。
最近更新 更多