我将如何解决这个问题,我有我已经对信息进行排序的文件,我想将该文件中的某个索引与另一个索引进行比较,一个问题是文件非常大,数百万行。我希望逐行比较我拥有的文件,如果匹配,我想使用索引方法将这些值与其他值一起输入。
=======================
让我澄清,我想说行[x] x将保持相同,因为它统一格式化,我想在另一个文件中对行[y]运行行[x],我想这样做到整个文件并将每个匹配对输出到另一个文件。在那个其他文件中,我还希望能够包含第一个文件中的其他部分,就像添加更多索引一样;行[a],行[b],行[c],行[d],最后行[y]作为与该信息的匹配。
尝试3:
我有一个包含以下格式信息的文件:
#x是一行
x= data,data,data,data,data,data
有数百万行。
我有另一个文件,格式相同:
xis a line
x= data,data,data,data
我想使用第一个文件中的x [#]和第二个文件中的x [#],我想看看这两个值是否匹配,如果它们我想要输出那些,以及其他几个x [#]第二个文件中的值,它们位于同一行。
这有助于理解吗? 文件所在的格式就像我说的那样:(但是有数百万,我想找到两个文件中的对,因为它们都应该匹配)
line 1 data,data,data,data
line 2 data,data,data,data
文件1中的数据:
(N'068D556A1A665123A6DD2073A36C1CAF', N'A76EEAF6D310D4FD2F0BD610FAC02C04DFE6EB67',
N'D7C970DFE09687F1732C568AE1CFF9235B2CBB3673EA98DAA8E4507CC8B9A881');
文件2中的数据:
00000040f2213a27ff74019b8bf3cfd1|index.docbook|Redhat 7.3 (32bit)|Linux
00000040f69413a27ff7401b8bf3cfd1|index.docbook|Redhat 8.0 (32bit)|Linux
00000965b3f00c92a18b2b31e75d702c|Localizable.strings|Mac OS X 10.4|OSX
0000162d57845b6512e87db4473c58ea|SYSTEM|Windows 7 Home Premium (32bit)|Windows
000011b20f3cefd491dbc4eff949cf45|totem.devhelp|Linux Ubuntu Desktop 9.10 (32bit)|Linux
它的排序顺序是字母数字,我想使用滑块方法。我的意思是,如果file1 [x]是< file2 [x]向下或向上移动滑块,具体取决于一个值是否大于另一个值,直到找到匹配为止,如果是,则何时打印输出以及将识别该哈希值的其他值。
我想要的结果是:
file1 [x]及其对应的file2 [x]匹配输出到文件,以及其他file1 [x],其中x可以是该行的任何索引。
答案 0 :(得分:3)
使用此方法并逐行比较,您不必将文件存储在内存中,因为文件很大。
with open('file1.txt') as f1, open('file2.txt') as f2, open('file3.txt','w') as f3:
for x, y in zip(f1, f2):
if x == y:
f3.write(x)
答案 1 :(得分:2)
我从澄清中得到了什么:
file1和file2采用相同的格式,每行看起来像
{32 char hex key}|{text1}|{text2}|{text3}
文件按键按升序排序
对于file1和file2中出现的每个键,您需要合并输出,因此每行看起来像
{32 char hex key}|{text11}|{text12}|{text13}|{text21}|{text22}|{text23}
你基本上想要合并排序中的碰撞:
import csv
def getnext(csvfile, key=lambda row: int(row[0], 16)):
row = csvfile.next()
return key(row),row
with open('file1.dat','rb') as inf1, open('file2.dat','rb') as inf2, open('merged.dat','wb') as outf:
a = csv.reader(inf1, delimiter='|')
b = csv.reader(inf2, delimiter='|')
res = csv.writer(outf, delimiter='|')
a_key, b_key = -1, 0
try:
while True:
while a_key < b_key:
a_key, a_row = getnext(a)
while b_key < a_key:
b_key, b_row = getnext(b)
if a_key==b_key:
res.writerow(a_row + b_row[1:])
except StopIteration:
# reached the end of an input file
pass
我仍然不知道你正在尝试通过'以及其他file1 [x]进行通信,其中x可以是来自该行的任何索引。
答案 2 :(得分:1)
比较指定索引处的两个文件的内容:
fp1 = open("file1.txt", "r")
fp2 = open("file2.txt", "r")
fp1.seek(index)
fp2.seek(index)
line1 = fp1.readline()
line2 = fp2.readline()
if line1 == line2:
print(line1)
fp1.close()
fp2.close()
逐行比较两个文件以查看它们是否匹配,否则打印行:
fp1 = open("file1.txt", "r")
fp2 = open("file2.txt", "r")
line1, line2 = fp1.readline(), fp2.readline()
while line1 and line2:
if line1 != line2:
print("Mismatch.\n1: %s\n2: %s" % (line1, line2))
fp1.close()
fp2.close()