使用字典和过滤器操作Python文本文件

2024-10-02 08:30:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试从两个不同的文件中获取文本,例如:

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

得到如下输出:

^{pr2}$

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

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函数进行比较,看看是否为真,如果是,则将整行追加到列表中以供输出。它还会从文件1中第一个数字的开头去掉“000”,并检查以确保两个文件中都存在相同的第一个数字。在

我的问题是:

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

2)添加过滤器后,根本不会将任何数据写入新文件,当我检查线.分割正确地创建了一个新的列表,但没有,这意味着没有数据可以过滤,因为splt_文件输入中没有数据。这对我来说很奇怪,我不明白这怎么可能发生。我测试了列表的创建,在末尾添加了一个writeline,它应该写出splt_file_1和splt_file_2列表,但是它没有输出任何内容。在

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

我需要任何帮助,我可以在删除这些错误,我不知道我的代码是错误的,还是如果我只是遗漏了一些东西,谢谢你的任何帮助。在


Tags: 文件数据lambda代码intxt列表for
2条回答

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

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

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

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

转换为数字类型也将消除前导0s。这可能有助于解决第二个问题,但无论如何,除非您对代码的这一部分进行更改,否则您将无法获得预期的结果。在

抱歉,没有纠正您的解决方案,但有时不同的采取也会有帮助。如果我没听错的话,这就是我的密码。在

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,因此您可以比较它们,值是浮点列表。在这之后就很容易了。在

^{pr2}$

希望有帮助。我想我的观点是:不要担心有点冗长或过于简单化,只要让它对你自己来说简单,如果你能避免的话,不要重复你自己。祝你好运。在

相关问题 更多 >

    热门问题