Python 比较包含一行单词的两个文件

Python 比较包含一行单词的两个文件,python,file-io,set,Python,File Io,Set,文件one.txt如下:one-two-tree 文件two.txt如下:one-four 我想找到这两个文件的并集。这段代码的结果是一个空白集。正确答案是one。错误在哪里 我找到了 one = open('one.txt') two=open('two.txt') def bres(obj1,obj2): x=obj1.readline().split() cc=obj2.readline().split() ela=set(x) elamou=set(cc) print el

文件
one.txt
如下:
one-two-tree
文件
two.txt
如下:
one-four

我想找到这两个文件的并集。这段代码的结果是一个空白集。正确答案是
one
。错误在哪里

我找到了

one = open('one.txt') 
two=open('two.txt')

def bres(obj1,obj2):
 x=obj1.readline().split()
 cc=obj2.readline().split()
 ela=set(x)
 elamou=set(cc)
 print elamou|ela
bres(one,two)
我找到了

one = open('one.txt') 
two=open('two.txt')

def bres(obj1,obj2):
 x=obj1.readline().split()
 cc=obj2.readline().split()
 ela=set(x)
 elamou=set(cc)
 print elamou|ela
bres(one,two)
上面的内容应该是有效的,并且基于您提供的代码

要获得结果,只需使用
print-bres(file\u-object\u 1,file\u-object\u 2)

上面的内容应该是有效的,并且基于您提供的代码


要获得结果,您只需使用
print-bres(file\u-object\u 1,file\u-object\u 2)
作为一种风格,我会将文件名传递到
bres
,并让它返回一个列表,然后从调用方打印出来

def bres(obj1,obj2):
    x=obj1.readline().split()
    cc=obj2.readline().split()
    results=[]
    for a in x:
        if a in cc:
            results.append(a)
    return results
如上所述(和您所做的一样)将
一起使用是处理打开和读取文件的最干净、最明确的方法。但是,如果出于某种原因您对较短的代码感兴趣,并且不介意依靠垃圾收集来关闭文件句柄,则可以使用列表理解将集合列表的创建缩短为一行:

def bres(file1, file2):
  sets = []
  for n in (file1, file2):
    with open(n) as f:
      sets.append( set( f.readline().split() ) )
  return list(sets[0] & sets[1])

print ' '.join(bres('one.txt', 'two.txt'))

我很想导入
操作符
并使用
reduce(operator.and_u,sets)
来概括事物-那些显式索引让我很烦。但是,这可能会在“Guido不喜欢函数式编程的原因”下归档。…

作为一种风格,我会将文件名传递到
BRE
,并让它返回一个列表,然后从调用方打印出来

def bres(obj1,obj2):
    x=obj1.readline().split()
    cc=obj2.readline().split()
    results=[]
    for a in x:
        if a in cc:
            results.append(a)
    return results
如上所述(和您所做的一样)将
一起使用是处理打开和读取文件的最干净、最明确的方法。但是,如果出于某种原因您对较短的代码感兴趣,并且不介意依靠垃圾收集来关闭文件句柄,则可以使用列表理解将集合列表的创建缩短为一行:

def bres(file1, file2):
  sets = []
  for n in (file1, file2):
    with open(n) as f:
      sets.append( set( f.readline().split() ) )
  return list(sets[0] & sets[1])

print ' '.join(bres('one.txt', 'two.txt'))


我很想导入
操作符
并使用
reduce(operator.and_u,sets)
来概括事物-那些显式索引让我很烦。但是那可能会被写在“Guido不喜欢函数式编程的原因”下。…

你是说
bres(一,二)
?@nehz那是我的错误。我对代码进行了编辑。仍然有一个错误。它对我有效。除非您真的希望答案是
one
,否则您需要的是交集,而不是并集-即
elamou&ela
。此外,直接输出子程序通常被认为是糟糕的设计。让
bres
返回所需的值,然后
打印bres(一,二)
。@MarkReed谢谢你的建议你的意思是
bres(一,二)
?@nehz那是我的错误。我对代码进行了编辑。仍然有一个错误。它对我有效。除非您真的希望答案是
one
,否则您需要的是交集,而不是并集-即
elamou&ela
。此外,直接输出子程序通常被认为是糟糕的设计。让
bres
返回所需的值,然后
打印bres(一,二)
。@MarkReed感谢您的建议使用
两次
是一个很好的执行方法。你能给我提个更好的建议吗?@MarkReed根据
函数
的问题,你是对的,没有函数的意义。根据打开的
,我必须使用这些文件。这就是我这样使用它的原因。@MarkReed有没有一种方法可以比较第二项中的文件begining的值?或者,您可以执行
,将open('one.txt')作为f,open('two.txt')作为g:
,但是我承认这里没有必要,因为您不需要同时打开两个文件。@BurhanKhalid我是指每行的第一项。使用
执行两次
是否合适。你能给我提个更好的建议吗?@MarkReed根据
函数
的问题,你是对的,没有函数的意义。根据打开的
,我必须使用这些文件。这就是我这样使用它的原因。@MarkReed有没有一种方法可以比较第二项中的文件begining的值?或者,您可以执行
,将open('one.txt')作为f,open('two.txt')作为g:
,但是我承认这里没有必要,因为您不需要同时打开两个文件。@BurhanKhalid我指的是每行的第一项。我同意@nehz。你为什么不在这个答案中使用集合呢?我同意@nehz。为什么在这个答案中不使用集合?只是想知道为什么在第二个示例中使用file()而在第二个示例中使用open()。。。否则,我想会有非常好的answerLisp背景显示,但是
open
with
之后对我来说是正确的。另一方面,
file
似乎是一种将字符串“强制转换”到文件对象中的方法,然后对其调用方法。当然,从技术上讲,这是完全一样的。但是上下文的细微差别让我接触到了不同的词。我找到了一个答案:只是想知道为什么在第二个示例中使用file()而在第二个示例中使用open()。。。否则,我想会有非常好的answerLisp背景显示,但是
open
with
之后对我来说是正确的。另一方面,
file
似乎是一种将字符串“强制转换”到文件对象中的方法,然后对其调用方法。当然,从技术上讲,这是完全一样的。但是上下文的细微差别让我想用不同的词。我找到了一个很好的答案: