我尝试从两个不同的文件中获取文本,例如:
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中遇到了问题。在
我需要任何帮助,我可以在删除这些错误,我不知道我的代码是错误的,还是如果我只是遗漏了一些东西,谢谢你的任何帮助。在
将字符串传递给
filter_func_1
和filter_func_2
,然后将它们与lambdas中的整数进行比较。但是当您比较数字和字符串时,比较是退化的:数字总是被认为在字符串之前(这是特定于实现的;我假设CPython行为)。所以第一个lambda总是返回True
,第二个lambda总是返回False
。结果,它们在你的代码中不能起到过滤器的作用。在您需要将传递的字符串转换为整数或浮点,例如:
或者在将输入传递给过滤器之前,可以先转换输入。在这两种情况下,您都应该考虑当输入无法转换为数字类型时要做什么。在
转换为数字类型也将消除前导
0
s。这可能有助于解决第二个问题,但无论如何,除非您对代码的这一部分进行更改,否则您将无法获得预期的结果。在抱歉,没有纠正您的解决方案,但有时不同的采取也会有帮助。如果我没听错的话,这就是我的密码。在
现在您有了两个文件的字典,其中的键是
^{pr2}$int
,因此您可以比较它们,值是浮点列表。在这之后就很容易了。在希望有帮助。我想我的观点是:不要担心有点冗长或过于简单化,只要让它对你自己来说简单,如果你能避免的话,不要重复你自己。祝你好运。在
相关问题 更多 >
编程相关推荐