免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7875 | 回复: 10

python 如何比较两个文件中的字符? [复制链接]

论坛徽章:
0
发表于 2013-12-21 08:59 |显示全部楼层
本帖最后由 jun1484528313 于 2013-12-21 13:06 编辑

有两个文本文件  pass 和 ct2013    :

#cat pass
李瑞
徐务
五仁



#cat ct2013
10.1.50.20                0194.de80.d181.6a        付足        111        13155                Yes        0        NULL
10.1.50.11           0100.219b.f906.0b        李瑞        112        1527811                Yes        1        12-5-23换MAC
10.1.50.4               0148.5b39.5c3e.04        朱赖        NULL        xxxxxxx                Yes        0        NULL
10.1.50.8              0100.0ae4.256e.fc        徐务        NULL        1347056                Yes        0        NULL
10.1.50.13             0118.0373.5626.59        五仁        214        1390728                Yes        1        2013-9


目的:希望可以用个脚本,如果在pass 文件中的名字 存在 ct2013 文件中的话 ,那么在 ct2013 中的 Yes 后面的数字变成" 1" ,反之,则变成“0”  输出来。

以下是尝试写的python文件,但是我的没有得到预期的结果。请教大家,该如何 可以实现上面的目的呢?

#vim    pass.py

  #!/usr/bin/env python
  #****conding:utf-8 *****

  pass_file = file("pass","r")
  for plines in pass_file.readlines():
      pline = plines.split()

      ct_file = file("ct2013","r")
      for ctlines in ct_file.readlines():
          ctline = ctlines.split()
          if (pline[0] <= ctline[2]):                              #如果,pline[0]  包含在  ctline[2] 中
               print ctline[0],ctline[1],ctline[2],ctline[3],ctline[4],ctline[5],1,ctline[7],"\n"                  #将Yes后面的都设置 为 “1”  输出
          else:
               print ctline[0],ctline[1],ctline[2],ctline[3],ctline[4],ctline[5],0,ctline[7],"\n"                  #否则 ,都设置为“0”  输出





论坛徽章:
0
发表于 2013-12-21 12:17 |显示全部楼层
本帖最后由 remyzane 于 2013-12-21 13:08 编辑

python 网易?
网易 python?
网易?
python?
蛮好?
好?

-----------------------------------------------------
刚才的
标题:python 网易?
内容:网易蛮好,还是python写的。
怎么给改成“比较两个文件的字符”了,这跨度也太大了点了吧。建议改成“比较python和网易”,开玩笑的别当真,呵呵。

论坛徽章:
0
发表于 2013-12-21 13:08 |显示全部楼层
本帖最后由 jun1484528313 于 2013-12-21 13:09 编辑

不谈论python 网易了。帮帮我看看上面的那个题目吧。想了好久了,也google了好多了。我也就只能写出上面的那点回复 2# remyzane


   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2013-12-21 13:59 |显示全部楼层
回复 3# jun1484528313
"如果在pass 文件中的名字 存在 ct2013 文件中的话 ,那么在 ct2013 中的 Yes 后面的数字变成" 1" ,反之,则变成“0”  输出来。"
很奇怪的逻辑,看上去应该是“逐行输出ct2013内容,如果该行的名字在pass文件中,则Yes 后面的数字变成" 1" ,反之,则变成“0”  输出来”?


   

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
发表于 2013-12-21 14:38 |显示全部楼层
假设需求是我上面所说的,即使不是,思路和实现方式也差不多。为了方便显示,用字符串IO代替了文件IO。
  1. Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
  2. Type "copyright", "credits" or "license()" for more information.
  3. >>> file_pass = '''
  4. 李瑞
  5. 徐务
  6. 五仁'''
  7. >>> file_ct2013 = '''
  8. 10.1.50.20                0194.de80.d181.6a        付足        111        13155                Yes        0        NULL
  9. 10.1.50.11           0100.219b.f906.0b        李瑞        112        1527811                Yes        1        12-5-23换MAC
  10. 10.1.50.4               0148.5b39.5c3e.04        朱赖        NULL        xxxxxxx                Yes        0        NULL
  11. 10.1.50.8              0100.0ae4.256e.fc        徐务        NULL        1347056                Yes        0        NULL
  12. 10.1.50.13             0118.0373.5626.59        五仁        214        1390728                Yes        1        2013-9'''
  13. >>> set_pass = set(name.strip() for name in file_pass.split() if len(name) > 0)
  14. >>> set_pass
  15. set(['\xce\xe5\xc8\xca', '\xc0\xee\xc8\xf0', '\xd0\xec\xce\xf1'])
  16. >>> from StringIO import StringIO
  17. >>> for line in StringIO(file_ct2013):
  18.         records = line.strip().split()
  19.         if len(records) != 8: continue
  20.         records[6] = 1 if records[2] in set_pass else 0
  21.         print records

  22.        
  23. ['10.1.50.20', '0194.de80.d181.6a', '\xb8\xb6\xd7\xe3', '111', '13155', 'Yes', 0, 'NULL']
  24. ['10.1.50.11', '0100.219b.f906.0b', '\xc0\xee\xc8\xf0', '112', '1527811', 'Yes', 1, '12-5-23\xbb\xbbMAC']
  25. ['10.1.50.4', '0148.5b39.5c3e.04', '\xd6\xec\xc0\xb5', 'NULL', 'xxxxxxx', 'Yes', 0, 'NULL']
  26. ['10.1.50.8', '0100.0ae4.256e.fc', '\xd0\xec\xce\xf1', 'NULL', '1347056', 'Yes', 1, 'NULL']
  27. ['10.1.50.13', '0118.0373.5626.59', '\xce\xe5\xc8\xca', '214', '1390728', 'Yes', 1, '2013-9']
  28. >>>
复制代码

论坛徽章:
0
发表于 2013-12-21 18:15 |显示全部楼层
嗯,是的。就是这个意思。看来我的表达能力还需要加强。回复 4# timespace


   

论坛徽章:
0
发表于 2013-12-21 20:34 |显示全部楼层
太好了。真厉害!!

可是我写成一个脚本的时候,只变了最后一个。这是为何?

我改写的文件如下:

#!/usr/bin/env python

pass_file = file("pass","r")
plines = pass_file.readlines()
for pline in plines:
  pline = pline.strip()
  if len(pline) > 0 :
      set_pass = set(pline.split())
  else:
      pass

ct_file = file("ct2013","r")
for ctlines in ct_file.readlines():
  ctline = ctlines.strip().split()
  ctline[6] = 1 if ctline[2] in set_pass else 0
  print ctline

结果:
Screenshot-2.png



回复 5# timespace


   

论坛徽章:
0
发表于 2013-12-22 02:01 |显示全部楼层
#!/usr/bin/env python

set_pass = []
pass_file = file("pass","r")
for line in pass_file.readlines():
    items = pline.strip()
    if items and items[0]:
        set_pass.append(items[0])
pass_file.close()

ct_file = file("ct2013","r")
for ctlines in ct_file.readlines():
    ctline = ctlines.strip().split()
    ctline[6] = 1 if ctline[2] in set_pass else 0
    print ctline

这代码我没调试,但应该没什么问题的
另外建议楼主别看我的代码,自行编写调试。有问题再单步调试,这样才能真正学到知识,不然你做了也等于没做。

论坛徽章:
0
发表于 2013-12-22 09:05 |显示全部楼层

使用一个列表 存取 名字name , 读取文件的每一行都存入其中。真是个好方法呀。

下面是我最后调试出来的程序:

#!/usr/bin/env python
pass_name = []
pass_file = file("pass","r")
plines = pass_file.readlines()
for pline in plines:
  pline = pline.strip()
  if len(pline) > 0:
     pass_name.append(pline)
  else:
    pass
pass_file.close()

ct_file = file("ct2013","r")
#print pass_name
for ctlines in ct_file.readlines():
  ctline = ctlines.strip().split()
  ctline[6] =1 if ctline[2] in pass_name else 0
  print ctline
ct_file.close()





好像,也抄了一些代码!

Screenshot.png
多谢您的提醒!我会多写些自己的代码的。






回复 8# remyzane


   

论坛徽章:
0
发表于 2013-12-22 09:12 |显示全部楼层
为了感谢大家帮忙解决问题,下面是我找到的一个小游戏,分享给大家玩。(可能有人玩过了!)

对于大侠们来说,这个游戏可能不好玩。但是对于像我刚入门的小人物来说,还是挺有意思的!

希望大家喜欢!

HackTheGame.rar

875.83 KB, 下载次数: 17

小游戏

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP