Python-打开文件以进行比较



我正在尝试打开两个文件,并检查file_1中的第一个单词是否在file_2中的任何行中。如果File_1中的行中的第一个单词与File_2中的行中的第一个单词匹配,我想打印两行。但是,对于以下代码,我没有得到任何结果。我将处理非常大的文件,因此我想避免使用列表或字典将文件放入内存中。我只能在Python3.3中使用内置功能。任何意见,将不胜感激?另外,如果有更好的方法,请也建议您。

我要执行的步骤:

1。(打开文件_12.(打开文件_23.(检查第一个单词是否在文件_2的任何行中。4.(如果两个文件中的第一个单词匹配,则打印来自file_1和file_2的行。

文件的内容:

file_1:
Apples: 5 items in stock
Pears: 10 items in stock
Bananas: 15 items in stock
file_2:
Watermelon: 20 items in stock
Oranges: 30 items in stock
Pears: 25 items in stock

代码尝试:

with open('file_1', 'r') as a, open('file_2', 'r') as b:
    for x, y in zip(a, b):
        if any(x.split()[0] in item for item in b):
            print(x, y)

所需的输出:

('Pears: 10 items in stock', 'Pears: 25 items in stock')

尝试:

for i in open('[Your File]'):
for x in open('[Your File 2]'):
    if i == x:
        print(i)

我实际上会大量建议将数据存储在1GB大小的文本文件中,而不是以某种数据库/标准数据存储文件格式中的某种形式。如果您的数据更为复杂,我建议至少建议CSV或某种划界格式。如果您可以将数据拆分并将数据存储在较小的块中,则可能是XML,HTML或JSON(将使数据的导航和提取变得容易(之类的标记语言,这些语言更加有条理,并且已经进行了优化以处理您正在尝试的方法做(定位匹配键并返回其值(。

也就是说,您可以使用Python 3文档第7.2.1节中的"读取"方法有效地做您要做的事情:https://docs.python.org/3/tutorial/inputOutput.html#读写文件。

,或者,您可以在文件上迭代:

def _get_key(string, delim):
    #Split key out of string
    key=string.split(delim)[0].strip()
    return key
def _clean_string(string, charToReplace):
    #Remove garbage from string
    for character in charToReplace:
        string=string.replace(character,'')
    #Strip leading and trailing whitespace
    string=string.strip()
    return string
def get_matching_key_values(file_1, file_2, delim, charToReplace):
    #Open the files to be compared
    with open(file_1, 'r') as a, open(file_2, 'r') as b:
    #Create an object to hold our matches
    matches=[]
    #Iterate over file 'a' and extract the keys, one-at-a-time
    for lineA in a:
        keyA=_get_key(lineA, delim)
        #Iterate over file 'b' and extract the keys, one-at-a-time
        for lineB in b:
            keyB=_get_key(lineB, delim)
            #Compare the keys. You might need upper, but I usually prefer 
            #to compare all uppercase to all uppercase
            if keyA.upper()==keyB.upper():
                cleanedOutput=(_clean_string(lineA, charToReplace), 
                               _clean_string(lineB, charToReplace))
                #Append the match to the 'matches' list
                matches.append(cleanedOutput)
        #Reset file 'b' pointer to start of file and try again
        b.seek(0)
    #Return our final list of matches 
    #--NOTE: this method CAN return an empty 'matches' object!
    return matches

这并不是真正/最有效的方法:

  1. 所有匹配都保存到内存中的列表对象
  2. 没有重复处理的处理
  3. 没有速度优化
  4. file'b'发生的迭代发生" n"时间,其中'n'是数量文件" A"中的行。理想情况下,您只能在每个文件上迭代一次。

即使仅使用基本python,我敢肯定还有一种更好的方法。

对于要点:https://gist.github.com/metajoker/a63f8596d1084b084b0868e1bdb5b5bdbdfb5f16

我认为要点也有指向repl的链接。如果您想在浏览器中使用副本,我用来编写和测试代码。

相关内容

  • 没有找到相关文章

最新更新