Python 如何从一个文本中取每一行到另外一个文本中匹配

2019-11-21 16:32:43 +08:00
 zhuzhuaini
假设有 A/B 两个文本 用 python 如何先从 A 中取出第一行 然后到 B 文本中每一行去匹配,如果匹配中了就啥也不干继续从 A 文本中取下一行匹配,如果在 B 文本中每一行都没匹配到,就输出 A 文本中第一行的数据然后继续去 A 文本中下一行去匹配
研究了一会发现不能达到自己的预期,特来请教.谢谢!
4710 次点击
所在节点    Python
33 条回复
ClericPy
2019-11-21 16:38:04 +08:00
需要掌握打开文件按行读取的 file.readline()
需要用到调整文件读取指针位置的 file.seek(0)
然后迭代器开几个 for 循环的函数, 共享已经打开的 A 和 B 俩文件就好了, 一般是在一个 with 下面俩文件对象, 然后写一个函数, 传参 line_text, file_object, 因为是迭代器, 内存占用还算可以接受

按你提的方式, 性能也高不到哪去了, 不过比现写个前缀树要省心多了
ClericPy
2019-11-21 16:38:45 +08:00
忘了 file_object 可以直接丢到 for, 不需要 readline...
cherbim
2019-11-21 16:40:48 +08:00
这不很简单,先 a.readline(),然后循环对比 b.readline()
cherbim
2019-11-21 16:44:45 +08:00
你的需求是不是把 a 中未在 b 中出现的每一行输出?
zhuzhuaini
2019-11-21 16:51:49 +08:00
@ClericPy 不是很理解你说的,,,我学的还不够~
zhuzhuaini
2019-11-21 16:52:37 +08:00
@cherbim 是的 A 中未在 B 出现的那一会 就打印 出现了 就啥也不干继续从 A 中取一行继续去 B 匹配
zhuzhuaini
2019-11-21 16:52:55 +08:00
@ClericPy 刚学 python 先不去考虑性能啥的~~~
ipwx
2019-11-21 16:55:31 +08:00
with open('B.txt', 'r') as f:
....B_lines = set(f)
with open('A.txt', 'r') as f:
....for line in f:
........if line not in B_lines:
............print(line)
cherbim
2019-11-21 17:01:16 +08:00
第一感觉就是新手,果然是新手。。。。
@zhuzhuaini 给你个代码吧,下面的代码,按行读取 1.txt 内容,然后按行与 2.txt 中比对,若不存在就输出,继续读取 1.txt
~~~
with open("1.txt", "r") as f:
while True:
i = f.readline()
if i:
with open("2.txt", "r") as file:
while True:
j = file.readline()
if j:
if i == j:
break
else:
print(i, end="")
break
else:
break
~~~
ClericPy
2019-11-21 17:07:41 +08:00
@zhuzhuaini #7

https://paste.ubuntu.com/p/W6Qq4mtjfv/

如果是面试题, 这段代码基本涵盖所有考点了, 但是很多小细节有炫技嫌疑...

1. with 打开文件保证安全关闭
2. seek 方法保证只需要打开一次文件 B 不需要多次打开
3. 对文件对象 A B 使用 for 循环, 节省内存
4. for 循环的 else 用法
5. with 上下文一次打开多个文件
cherbim
2019-11-21 17:09:06 +08:00
你先试着用 readline(),完整的输出一个文件(一行一行输出),理解了这个,你的需求就很容易解决了
nznd
2019-11-21 17:09:26 +08:00
with open('1.txt', 'r') as f, open('2.txt', 'r') as ff:
a = set(f)
b = set(ff)
print(a-b)
简单粗暴(
nznd
2019-11-21 17:09:54 +08:00
@nznd #12 缩进丢了 但是应该看的出来吧(狗头
zhuzhuaini
2019-11-21 17:11:49 +08:00
@cherbim 刚刚在调试你传的代码,,,光缩进就调整了一段时间, 执行之后报错
i = f.readline()
UnicodeDecodeError: 'gbk' codec can't decode byte 0x93 in position 15: illegal multibyte sequence
zhuzhuaini
2019-11-21 17:12:08 +08:00
@ClericPy 谢谢 不是面试题 纯是自己有这个需求~
zhuzhuaini
2019-11-21 17:12:33 +08:00
@nznd 太简单粗暴了,导致看不懂 谢谢老哥了哈~~~~
nznd
2019-11-21 17:16:51 +08:00
zhuzhuaini
2019-11-21 17:17:23 +08:00
@cherbim 谢谢 我加入了 encoding='UTF-8' 这个参数后就不报错了 虽然不知道为啥要加这个-.-
zhuzhuaini
2019-11-21 17:17:46 +08:00
@nznd 听到数学,,我哭辽
miemiekurisu
2019-11-21 17:22:39 +08:00
两个 readlines 成 2 个 list,set 一下成 2 个集合,把两个集合 intersection 一下,就是共有部分,要知道具体哪几行就拿着 intersection 出来的结果每一个去 iteration 一遍第二个文本

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/621811

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX