如何根据 python 中两个单独文本文件的子字符串提取行?
How to extract lines based on a substring from two separate text files in python?
我有两个文本文件。第一个是以下形式:
K, 6
J, 5
L, 4
第二个文件的格式为:
K_1, 6
K_2, 5
J_1, 4
J_2, 4
J_3, 5
L_1, 4
我需要以下形式的输出:
K_1, 6, 6, same
K_2, 5, 6, different
J_1, 4, 5, different
J_2, 4, 5, different
J_3, 5, 5, same
L_1, 4, 4, same
其中每一行都以第二个文本文件中的行开头(前两个值),然后我必须根据第一个文本文件中的子字符串选择第三个值(即对于 K_1,子字符串是 K我需要从第一个文本文件中选择值 6)。如果每行中的值相同,则应打印 "same" 否则每行打印 "different"。
最后我需要计算输出文件中 "same" 的行数和 "different" 的行数。
我尝试编写以下代码,但它没有给我预期的输出:
m1 = open('TextFile_1.txt')
m2 = open('TextFile_2.txt')
result = open('Output.txt','w')
lookup_from = {}
l2=[]
for line1 in m1:
z1 = line1.split(',')[0].strip()
z2 = z1.split('_')[0].strip()
z3 = line1.split(',')[1].strip()
ZX = (z2, z1, z3)
lookup_from[ZX] = 0
for line2 in m2:
z11 = line2.split(',')[0].strip()
z22 = z11.split('_')[0].strip()
z33 = line2.split(',')[1].strip()
if z22 in [x for x,_,_ in lookup_from]:
z4 = (z22, z11, z33)
z5 = z4 + tuple([x for _,_,x in lookup_from])
l2.append(z5)
for i in l2:
result.write(str(i)[1:-1]+'\n')
result.close()
您可以使用 pd.read_csv()
输入您的数据替换下面的 file1 和 file2 然后使用以下代码:
import pandas as pd
import numpy as np
file1 = pd.DataFrame({'col1': ['K', 'J', 'L'],
'col2': [6, 5, 4]})
file2 = pd.DataFrame({'col3': ['K_1', 'K_2','J_1', 'J_2', 'J_3', 'L_1'],
'col4': [6, 5, 4, 4, 5, 4]})
file2['col1'] = file2.col3.str[0]
compare = file2.merge(file1)
del(compare['col1'])
compare['result'] = np.where(compare.col4 == compare.col2, 'same', 'different')
print(compare)
输出:
col3 col4 col2 result
0 K_1 6 6 same
1 K_2 5 6 different
2 J_1 4 5 different
3 J_2 4 5 different
4 J_3 5 5 same
5 L_1 4 4 same
如果您从第一个文件创建一个简单的键值字典,然后在读取第二个文件时即时生成输出,则可以避免所有复杂的查找:
with open('TextFile_1.txt') as f1:
lookup = dict([x.strip() for x in line.split(',')] for line in f1)
with open('Output.txt', 'w') as out:
with open('TextFile_2.txt') as f2:
for line in f2:
k, v = [x.strip() for x in line.split(',')]
n = lookup[k.split('_')[0]]
out.write(', '.join(
[k, v, n, 'same' if v == n else 'different']) + '\n')
输出:
K_1, 6, 6, same
K_2, 5, 6, different
J_1, 4, 5, different
J_2, 4, 5, different
J_3, 5, 5, same
L_1, 4, 4, same
我有两个文本文件。第一个是以下形式:
K, 6
J, 5
L, 4
第二个文件的格式为:
K_1, 6
K_2, 5
J_1, 4
J_2, 4
J_3, 5
L_1, 4
我需要以下形式的输出:
K_1, 6, 6, same
K_2, 5, 6, different
J_1, 4, 5, different
J_2, 4, 5, different
J_3, 5, 5, same
L_1, 4, 4, same
其中每一行都以第二个文本文件中的行开头(前两个值),然后我必须根据第一个文本文件中的子字符串选择第三个值(即对于 K_1,子字符串是 K我需要从第一个文本文件中选择值 6)。如果每行中的值相同,则应打印 "same" 否则每行打印 "different"。
最后我需要计算输出文件中 "same" 的行数和 "different" 的行数。
我尝试编写以下代码,但它没有给我预期的输出:
m1 = open('TextFile_1.txt')
m2 = open('TextFile_2.txt')
result = open('Output.txt','w')
lookup_from = {}
l2=[]
for line1 in m1:
z1 = line1.split(',')[0].strip()
z2 = z1.split('_')[0].strip()
z3 = line1.split(',')[1].strip()
ZX = (z2, z1, z3)
lookup_from[ZX] = 0
for line2 in m2:
z11 = line2.split(',')[0].strip()
z22 = z11.split('_')[0].strip()
z33 = line2.split(',')[1].strip()
if z22 in [x for x,_,_ in lookup_from]:
z4 = (z22, z11, z33)
z5 = z4 + tuple([x for _,_,x in lookup_from])
l2.append(z5)
for i in l2:
result.write(str(i)[1:-1]+'\n')
result.close()
您可以使用 pd.read_csv()
输入您的数据替换下面的 file1 和 file2 然后使用以下代码:
import pandas as pd
import numpy as np
file1 = pd.DataFrame({'col1': ['K', 'J', 'L'],
'col2': [6, 5, 4]})
file2 = pd.DataFrame({'col3': ['K_1', 'K_2','J_1', 'J_2', 'J_3', 'L_1'],
'col4': [6, 5, 4, 4, 5, 4]})
file2['col1'] = file2.col3.str[0]
compare = file2.merge(file1)
del(compare['col1'])
compare['result'] = np.where(compare.col4 == compare.col2, 'same', 'different')
print(compare)
输出:
col3 col4 col2 result
0 K_1 6 6 same
1 K_2 5 6 different
2 J_1 4 5 different
3 J_2 4 5 different
4 J_3 5 5 same
5 L_1 4 4 same
如果您从第一个文件创建一个简单的键值字典,然后在读取第二个文件时即时生成输出,则可以避免所有复杂的查找:
with open('TextFile_1.txt') as f1:
lookup = dict([x.strip() for x in line.split(',')] for line in f1)
with open('Output.txt', 'w') as out:
with open('TextFile_2.txt') as f2:
for line in f2:
k, v = [x.strip() for x in line.split(',')]
n = lookup[k.split('_')[0]]
out.write(', '.join(
[k, v, n, 'same' if v == n else 'different']) + '\n')
输出:
K_1, 6, 6, same
K_2, 5, 6, different
J_1, 4, 5, different
J_2, 4, 5, different
J_3, 5, 5, same
L_1, 4, 4, same