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

#先创建个a.txt
file_a = open('a.txt','w') #在当前目录下创建a.txt,写入模式,如果不确定目录先os.getcwd(),不然找不到不怪我哦
file_a.write('3\n9\n5\n4\n') #写入数据
file_a.close()
file_b = open('b.txt','w')
for i in range(10):
file_b.write(str(i)+'\n') #写入1\n2\n3\n....9\n
file_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 x
break
#结果是3\n9\n,只有3和9,这下懵逼了,应该是3\n9\n5\n4\n啊
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 x
file_b.seek(0)
break
file_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 x
break
file_a.close()
file_b.close()
#我建议用第二种,因为第一种需要有游标重置的动作,虽然几条没有影响,不过如果是几千万的话影响应该会很大把,不过话说回来了,几千万谁还会用嵌套循环呢,hash或二分法才是正确的选择,当然最快的一定是树查询

python被游标坑了的更多相关文章

  1. Python 的赋值坑 , a=b=c=1???

    原文地址:https://www.v2ex.com/amp/t/443384 Python 的赋值坑 , a=b=c=1??? 今天回答了一个主题, 一不小心进入了一个坑, 耗费了好多时间终于弄懂了我 ...

  2. 跳出python的各种坑(1)

    2017-11-1915:38:17 一定要跳出python的各种坑,一开始遇到的好多思维上的认知错误,因为刚开始学习,对python是个什么都不清楚,所以记录一下自己遇到的各种坑.不用担心自己遇到的 ...

  3. Python语言防坑小技巧

    Python语言防坑小技巧 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.赋值即定义  1>.运行以下代码会出现报错 #!/usr/bin/env python #_*_ ...

  4. python 之走坑的道路

    ### python之 继续走函数的坑 上篇文章简单介绍了函数的一些简单的使用,这次继续踩函数的坑1.函数对象 函数其实也可以当做一个参数传给另一个函数,也可以使用赋值的方式来给另一个,而且这两个的内 ...

  5. 初学python 遇到的坑

    这最近人工智能比较火,看了一下大多都是python的代码,最近看看python 的代码,一出来就遇到了坑,空格的问题先不说了直接上代码吧 # coding = utf-8 import urllib. ...

  6. python使用游标访问数据

    游标是一种数据访问对象,可用于在表中迭代一组行或者向表中插入新行.游标有三种形式:搜索.插入或更新.游标通常用于读取现有几何和写入新几何. 每种类型的游标均由对应的 ArcPy 函数(SearchCu ...

  7. Python的入坑之路(1)

    (故事背景:由于涉及到机密的原因,暂时不方便透露,待后期再写.) 国庆长假过完之后,回来上班第二天下午,Boss跟龙哥把我叫了出去,问我要不要转人工智能.一脸懵逼的我,带着一脸懵逼听Boss说人工智能 ...

  8. win7 python pdf2image入坑经历

    Python开发菜鸟入坑 项目要求pdf转成图片,网上较多的方案对于windows极其不友好,wand,Pythonmagick(win下载地址:www.lfd.uci.edu/~gohlke/pyt ...

  9. 对Python中一些“坑”的总结及技巧

    一.赋值即定义 1.运行以下代码会出现报错 #!/usr/bin/env python #_*_conding:utf-8_*_ x = 100 def outer(): def inner(): x ...

随机推荐

  1. tomcat关闭后线程依然运行解决办法

    tomcat关闭后线程依然运行解决办法,设置线程为守护线程 守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户 ...

  2. Docker Swarm 日常运维命令笔记

    之前介绍了Docker管理工具-Swarm部署记录,这里简单总结下Docker Swarm的日常维护命令,以作为平时运维笔记. Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以 ...

  3. Git 撤销与修改

    增补提交 git commit –C HEAD –a --amend -C表示复用指定提交的提交留言,这个例子中是HEAD,实际上可以指定其他有效的提交名称. 如果参数是小写的-c,就会打开预先设置好 ...

  4. LINQ查询操作符 LINQ学习第二篇

    一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataCo ...

  5. Windows7下IIS+php配置教程 http://www.jb51.net/article/113812.htm

    这篇文章主要为大家详细介绍了Windows7下IIS+php配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 WINDOWS 7 IIS+php配置教程,具体内容如下 打开 开始 -> ...

  6. c#FTP应用---windows iis

    一.什么是FTP FTP(File Transfer Protocol)是TCP/IP网络上两台计算机传送文件的协议,使得主机间可以共享文件. 二.搭建前期准备 1.首先打开控制面板找到“程序”点击打 ...

  7. 10.C#知识点:操作XML

    知识点目录==========>传送门 XML是什么就不用说了文本标记语言. 主要纪录如何对XML文件进行增删改查. Xml的操作类都存在System.xml命名空间下面. 应用型的直接上代码 ...

  8. c# 对文件的各种操作

    C# 获取文件名及扩展名 string aFirstName = aFile.Substring(aFile.LastIndexOf("\\") + 1, (aFile.LastI ...

  9. java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.String(Short类型无法强转成String类型)

    有一行Java代码如下: String code1 = (String)qTable1.getValueAt(i, 0); 这是一个Java的图形界面获取表格中值的代码,其中qTable1.getVa ...

  10. 【Linux】编辑文件时,箭头按键还有BACKSPACE按键不能正常使用的解决办法

    需要安装vim sudo apt-get  remove vim-common sudo apt-get install vim