0

我正在尝试从两个单独的文件中获取文本,例如:

File 1:
000892834     13.663      0.098      0.871      0.093      0.745      4.611       4795

File 2:
892834  4916   75   37  4857 130 128  4795  4.61 -0.09    0 0

并获得如下输出:

892834     13.663      0.098      0.871      0.093      0.745      4.611       4795
892834     4916        4795       -0.09

我有一些似乎接近解决方案的代码:

filter_func_1 = lambda x: x >= 15   
filter_func_2 = lambda x: (5777 + 100) > x > (5777 - 100)
mergedData = defaultdict(list)
with open('Table1_Karoff.txt') as file_1, open('Table7_Pinsonneault.txt') as file_2, open('Processed_Data.txt', 'w') as outfile:
        for line_1 in file_1:
            splt_file_1 = line_1.split()
            if filter_func_1(splt_file_1[1]):
                 mergedData[splt_file_1[0].lstrip('0')].append(line_1)
        for line_2 in file_2:
                splt_file_2 = line_2.split()
        Data = map(itemgetter(0, 1, 8, 9), line_2)
            if filter_func_2(splt_file_2[1]):
                 mergedData[splt_file_2[0]].append(['   '.join(map(str, i)) for i in Data])
        for k in mergedData:
            if len(mergedData[k]) == 2:
                outfile.write("\n".join(mergedData[k]) + "\n")          
        return outfile

这段代码“应该”做的是使用 lambda 运算符创建两种过滤器,将每行中的某个索引与 lambda 函数进行比较,看看它是否为真,如果是,则将整行附加到一个列表中以供输出. 它还将“000”从文件 1 中第一个数字的开头剥离,并检查以确保两个文件中存在相同的第一个数字。

我的问题是:

1) file_1 ID #(第一个数字)没有正确地从其中删除所有 0,尽管据我所知代码应该这样做。它输出为 00892834,因此只删除了第一个 0。

2)添加过滤器后,根本不会将任何数据写入新文件,当我检查 line.split 是否正确创建了新列表时,它没有,这意味着没有要过滤的数据因为 splt_file_# 输入中没有数据。这对我来说很奇怪,我不明白这怎么可能发生。我通过在末尾添加一个应该写出 splt_file_1 和 splt_file_2 列表的写行来测试列表创建,但是它没有吐出任何东西。

3)由于我需要的值不能按顺序从文件 2 的列表中调用(我只需要索引 0、1、8、9)我尝试映射然后格式化数据,但这给出了一个超出范围的索引问题,这是可以理解的,因为我在上面 #2 中的问题。

我需要任何帮助来消除这些错误,我不知道我的代码是错误的还是我只是遗漏了一些东西,感谢您提供的任何帮助。

4

2 回答 2

1

您将字符串传递给filter_func_1然后filter_func_2将它们与 lambda 中的整数进行比较。但是当你比较数字和字符串时,比较是退化的:数字总是被认为在字符串之前(这是特定于实现的;我假设 CPython 行为)。所以你的第一个 lambda 总是要返回True,而第二个False. 因此,它们在您的代码中不能用作过滤器。

您需要将传递的字符串转换为整数或浮点数,例如:

filter_func_1 = lambda x: float(x) >= 15   

或者您可以在将输入传递给过滤器之前对其进行转换。无论哪种情况,您都应该考虑当输入无法转换为数字类型时要做什么。

转换为数字类型也会去掉前导0s。它可能会或可能不会帮助您解决第二个问题,但无论如何,在您对代码的这一部分进行更改之前,您都不会得到预期的结果。

于 2013-07-09T18:57:45.757 回答
1

很抱歉没有更正您的解决方案,但有时不同的做法也会有所帮助。如果我理解正确,这将是我的代码。

file_1_data = dict()
file_2_data = dict()
for filename, data in [('infile1.txt', file_1_data), ('infile2.txt', file_2_data)]:
with open(filename) as f:
    for line in f:  
        split_line = line.split()       
        first_int = int(split_line[0])
        rest_floats = [float(f) for f in split_line[1:]]
        data[first_int] = rest_floats

现在你有了两个文件的字典,其中的键是int,所以你可以比较它们,值是浮点数列表。在此之后,这很容易。

def filter_1(x):
return x > 1

def filter_2(x): 
return 4 < x < 100000

with open('outfile.txt', 'wb') as outfile:
for key in file_1_data:
    if key in file_2_data:
        #write a record, the first one
        data_to_write = [str(f) for f in file_1_data[key] if filter_1(f)]       
        record = '  '.join([str(key)] + data_to_write) + '\n'
        outfile.write(record)
        #second one, do filtering here
        data_to_write = [str(f) for f in file_2_data[key] if filter_2(f)]
        record = '  '.join([str(key)] + data_to_write) + '\n'   
        outfile.write(record)

希望能帮助到你。我认为我的观点是:不要担心会有点冗长或过于简单化,只要让自己轻松一点,如果可以避免就不要重复自己。祝你好运。

于 2013-07-09T18:08:43.490 回答