我正在尝试打开两个文件,并检查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
这并不是真正/最有效的方法:
- 所有匹配都保存到内存中的列表对象
- 没有重复处理的处理
- 没有速度优化
- file'b'发生的迭代发生" n"时间,其中'n'是数量文件" A"中的行。理想情况下,您只能在每个文件上迭代一次。
即使仅使用基本python,我敢肯定还有一种更好的方法。
对于要点:https://gist.github.com/metajoker/a63f8596d1084b084b0868e1bdb5b5bdbdfb5f16
我认为要点也有指向repl的链接。如果您想在浏览器中使用副本,我用来编写和测试代码。