python被游标坑了

python被游标坑了,第1张

概述为了方便,这次就不单独写脚本了,直接一步一步执行下来就好了先说下游标,就是一个指针,比如我有1234每条占一行,那么初始游标默认是在1的位置,当read(1)后,游标自动向下next,现在指在2的位置,依次类推,然后是3,4直到最后,除非强制移动游标,否则游标不会再返回的今天写了一个脚本,具体就是有两个txt,a.txt和b.txt,从a.txt里面取值,去b.txt里面查看,是否存在,如果存在就把这条print出来上例子#先创建个a.txtfile_a = open('a.txt','w') #在当前目录下创建a.txt,写入模式,如果不确定目录先os.getcwd(),不然找不到不怪我哦file_a.write('3n9n5n4n') #写入数据file_a.close()file_b = open('b.txt','w')for i in range(10):file_b.write(str(i)+'n') #写入1n2n3n....9nfile_b.close()#下面来读取匹配下file_a = open('a.txt','r')file_b = open('b.txt','r')for x in file_a:x = x.strip()for y in file_b:y = y.strip()if x == y:print xbreak#结果是3n9n,只有3和9,这下懵逼了,应该是3n9n5n4n啊file_a.close()file_b.close()#结果这破玩意我改了一个小时,怎么都是3,然后觉得这样没有啥效果,仔细想了一下,原来是游标的问题,尼玛的#我来解释下,因为file_a的类型是file,而file类型是使用指针的,就是和我上面说的一样,除非强制移动,否则游标不会再返回的#就是说在嵌套循环里面for y in file_b的时候匹配到3了,那么游标停在3上,下一个是9,那么第二轮是从3开始向下找,找到9,9之后就再没有了,所以无论怎么匹配也匹配不到的#知道原因在哪里就好办了,有两种办法,先说第一种把,用seek(0)将游标移动到开始file_a = open('a.txt','r')file_b = open('b.txt','r')for x in file_a:x = x.strip()for y in file_b:y = y.strip()if x == y:print xfile_b.seek(0)breakfile_a.close()file_b.close()#第二种是用readlines,把文件里的数据按行read成list,list是没有游标概念的,list只有下标,每次都会从头循环file_a = open('a.txt','r')file_b = open('b.txt','r')file_b_list = file_b.readlines() #只改file_b就可以了,因为a是主表for x in file_a:x = x.strip()for y in file_b_list:y = y.strip()if x == y:print xbreakfile_a.close()file_b.close()#我建议用第二种,因为第一种需要有游标重置的动作,虽然几条没有影响,不过如果是几千万的话影响应该会很大把,不过话说回来了,几千万谁还会用嵌套循环呢,hash或二分法才是正确的选择,当然最快的一定是树查询 

为了方便,这次就不单独写脚本了,直接一步一步执行下来就好了先说下游标,就是一个指针,比如我有1234每条占一行,那么初始游标默认是在1的位置,当read(1)后,游标自动向下next,现在指在2的位置,依次类推,然后是3,4直到最后,除非强制移动游标,否则游标不会再返回的今天写了一个脚本,具体就是有两个txt,a.txt和b.txt,从a.txt里面取值,去b.txt里面查看,是否存在,如果存在就把这条print出来上例子

file_a = open(,) file_a.write() = open(, i range(10+) <span >#<span >下面来读取匹配下
file_a = open(<span >'
<span >a.txt
<span >'
,<span >'
<span >r
<span >'
<span >)
file_b
= open(<span >'
<span >b.txt
<span >'
,<span >'
<span >r
<span >'
<span >)
<span >for
x <span >in
<span > file_a:
x
=<span > x.strip()
<span >for
y <span >in
<span > file_b:
y
=<span > y.strip()
<span >if
x ==<span > y:
<span >print
<span > x
<span >break

<span >#
<span >结果是3\n9\n,只有3和9,这下懵逼了,应该是3\n9\n5\n4\n啊

<span >file_a.close()
file_b.close()

<span >#<span >结果这破玩意我改了一个小时,怎么都是3,然后觉得这样没有啥效果,仔细想了一下,原来是游标的问题,尼玛的<span >

<span >我来解释下,因为file_a的类型是file,而file类型是使用指针的,就是和我上面说的一样,除非强制移动,否则游标不会再返回的<span ><span >就是说在嵌套循环里面for y in file_b的时候匹配到3了,那么游标停在3上,下一个是9,那么第二轮是从3开始向下找,找到9,9之后就再没有了,所以无论怎么匹配也匹配不到的<span ><span >知道原因在哪里就好办了,有两种办法,先说第一种把,用seek(0)将游标移动到开始

file_a = open(<span >'<span >a.txt<span >',<span >'<span >r<span >'<span >)
<span >for x <span >in<span > file_a:
x =<span > x.strip()
<span >for y <span >in<span > file_b:
y =<span > y.strip()
<span >if x ==<span > y:
<span >print<span > x
file_b.seek(0)
<span >break<span >
file_a.close()
file_b.close()

<span >#<span >第二种是用readlines,把文件里的数据按行read成List,List是没有游标概念的,List只有下标,每次都会从头循环
file_a = open(<span >'<span >a.txt<span >',<span >'<span >r<span >'<span >)
filebList = file_b.readlines() <span >#<span >只改file_b就可以了,因为a是主表
<span >for x <span >in<span > file_a:
x =<span > x.strip()
<span >for y <span >in<span > filebList:
y =<span > y.strip()
<span >if x ==<span > y:
<span >print<span > x
<span >break<span >
file_a.close()
file_b.close()
<span >#<span >我建议用第二种,因为第一种需要有游标重置的动作,虽然几条没有影响,不过如果是几千万的话影响应该会很大把,不过话说回来了,几千万谁还会用嵌套循环呢,hash或二分法才是正确的选择,当然最快的一定是树查询

总结

以上是内存溢出为你收集整理的python被游标坑了全部内容,希望文章能够帮你解决python被游标坑了所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1208131.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存