使用 Python v3.5 加载制表符分隔的文件,省略一些行,并将特定列中的最大值和最小浮点数输出到新文件中



我已经尝试了几个小时来研究这个问题,但每个可能的解决方案都不适合我的特定需求。我已经用 Python (v3.5) 编写了以下内容来下载制表符分隔的.txt文件。

#!/usr/bin/env /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5
import urllib.request
import time
timestr = time.strftime("%Y-%m-%d %H-%M-%S")
filename="/data examples/"+ "ace-magnetometer-" + timestr + '.txt'
urllib.request.urlretrieve('http://services.swpc.noaa.gov/text/ace-magnetometer.txt', filename=filename)

这将从此处下载文件并根据当前时间重命名它。它工作得很好。

我希望我可以使用"filename"变量加载文件并对其执行一些操作(而不必写出完整的文件路径和文件名,因为我的最终目标是对数百个不同的文件执行以下操作,因此从长远来看使用变量会更容易)。

这种使用变量的想法似乎有效,因为将以下内容添加到上面会将文件的内容打印到 STDOUT...(因此它能够毫无问题地找到文件):

import csv
with open(filename, 'r') as f:
    reader = csv.reader(f, dialect='excel', delimiter='t')
    for row in reader:
            print(row)

从文件中可以看出,前 18 行是信息性的。第 19 行提供实际的列名。然后是一行破折号。

我感兴趣的实际数据从第 21 行开始。

我想在"Bt"列(右起第三列)中找到最小和最大数字。我发现的可能的解决方案之一仅适用于整数,并且此数据集具有浮点数。

另一个可能的解决方案涉及导入 pyexcel 模块,但我似乎无法正确安装它......

import pyexcel as pe
data = pe.load(filename, name_columns_by_row=19)
min(data.column["Bt"])

我希望能够将最小 Bt 和最大 Bt 值打印到两个单独的文件中,分别称为 minBt.txt 和 maxBt.txt。

请任何人提供任何指示。

这是对你向 Apoc 提出的最新问题的评论,但我是新来的,所以我不被允许发表评论。可能会产生问题的一件事是bz_values(就此而言,bt_values)可能是一个字符串列表(至少当我尝试在您链接到的示例文件上运行 Apoc 的脚本时是这样)。您可以通过替换以下内容来解决此问题:

min_bz = min([float(x) for x in bz_values]) 
max_bz = max([float(x) for x in bz_values])

为此:

min_bz = min(bz_values)
max_bz = max(bz_values)

只要所有文件都以相同的方式格式化,即数据 21 行,相同数量的列等,以下内容就可以工作。此外,您链接的文件似乎没有制表符分隔,因此我只是在每行上使用字符串split方法而不是 csv 阅读器。该列从文件中读入到列表中,该列表用于计算最大值和最小值:

from itertools import islice
# Line that data starts from, zero-indexed.
START_LINE = 20
# The column containing the data in question, zero-indexed.
DATA_COL = 10
# The value present when a measurement failed.
FAILED_MEASUREMENT = '-999.9'
with open('data.txt', 'r') as f:
    bt_values = []
    for val in (row.split()[DATA_COL] for row in islice(f, START_LINE, None)):
        if val != FAILED_MEASUREMENT:
            bt_values.append(float(val))
    min_bt = min(bt_values)
    max_bt = max(bt_values)
with open('minBt.txt', 'a') as minFile:
    print(min_bt, file=minFile)
with open('maxBt.txt', 'a') as maxFile:
    print(max_bt, file=maxFile)

我假设由于您正在对多个文件执行此操作,因此您希望在maxBt.txtminBt.txt文件中累积多个最大值和最小值,因此我以"追加"模式打开它们。如果不是这种情况,请将 'a' 参数换成 'w' ,每次都会覆盖文件内容。

编辑:已更新以包括失败测量的解决方法,如注释中所述。

编辑2:更新以修复负数问题,德里克在单独的答案中也指出了这一点。

相关内容

最新更新