python 求助

datianshi_1228 2014-03-28 10:33:29
想写一个IP比较的脚本,由于内容过多造成list时print打印不全你,想换成线程,但是使用_thread 时候告诉创建不成功,求助大侠了,我是刚学python啊,才看了10小时的书 ,谢谢大家来

# -*- coding:utf-8 -*-

"""打开一个EXCEL格式的文件,对里面的相关内容进行遍历"""
import xlrd
import threading
import _thread
import socket, struct
from IPy import IP
import time

def read_file(buf):
frame=buf
data=xlrd.open_workbook(frame)
try:
sh=data.sheet_by_name("已导出的系统")
except:
print("do not open Sheet1")
return 0
"""ncols=sh.ncols"""
nrow=sh.nrows
"""print(ncols)"""
"""print(nrow)"""
print("文件读取中……")
i=1
i=int(i)
while i<int(nrow):
cell_A1 = sh.cell(i,3).value
check_file(nrow,cell_A1)
i=i+1
def check_file(buf1,sheet):

"""从列表中取得相关的IP字段,并与列表中的IP段进行比较,如果没有所存在的IP地址则写入,如果存在则计数+1"""
file_sheet=sheet
i=0
buf_No=0

if(file_sheet==""):
return
else:
iplong=ip2long(file_sheet)
if len(ip_longlist)==0:
ip_longlist.append(iplong)
ip_longlist.append(1)

else:
while i< int (len(ip_longlist)):



checkIP=int(ip_longlist[i])


if(iplong==checkIP):

"""print(checkIP)"""
i=i+1
"""print("i" ,i)"""
buf_No=ip_longlist[i]
""" print("buf_No" ,buf_No)"""

ip_longlist[i]=buf_No+1
"""print(ip_longlist)"""

return
else:

list_long=len(ip_longlist)
list_long=int (list_long-1)
"""print(list_long)"""


if(i==list_long):

ip_longlist.append(iplong)
ip_longlist.append(1)
"""print(ip_longlist)"""
return

else:

i=i+1

def ip2long(ip):


packedIP=socket.ntohl(struct.unpack("I",socket.inet_aton(ip))[0])

return packedIP
def zhuanhan_ip(longIP):
middle=[]
middle=longIP
buf_long=int(len(middle))
print(buf_long)
print("ip 疯狂转化中")
buf_long=buf_long

for i in range(0,buf_long,2):
iP_addr=middle[i]
ip_list.append(socket.inet_ntoa(struct.pack('!L',iP_addr)))
time.sleep(0.01)
ip_list.append(middle[i+1])


if __name__=="__main__":
ip_list=[]
ip_longlist=[]
buf='e:\\123.xls'

print("信息正在处理中请稍后")
try:

_thread.start_new(read_file,())

except:

print ("Error: unable to start thread")
print("数据已经整理完成,IP转换中……")

zhuanhan_ip(ip_longlist)
print(ip_list)
print("处理完成")



...全文
191 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
datianshi_1228 2014-03-29
  • 打赏
  • 举报
回复
谢谢大家的支持,好像分析了问题,具体的问题是我要打印一个5000行的list,IP列表,直接使用了print(list_name),在i/o输出的时候会出现堵塞使用wing编译工具的时候,但是我换成了eri就没有了问题 ,真实奇怪。学习python还在逐步深入,也是学了线程的方法谢谢大家
panghuhu250 2014-03-28
  • 打赏
  • 举报
回复
1. "打印不全": 不大明白你是什么意思。但一般来说,加上thread不会解决输入输出方面的问题,只会增加更多的麻烦(比如两个thread的输出互相掺杂在一起)。 2. 如果要用线程,就像7楼说的,用threading模块比_thread好。 建议还是回到最开始:“内容过多造成list时print打印不全”是什么问题,症状是什么?
nieoding 2014-03-28
  • 打赏
  • 举报
回复
在main()后面加个time.sleep(10)试试? 如果可以那是因为线程启动,主进程退出了。 换threading.Thread吧
datianshi_1228 2014-03-28
  • 打赏
  • 举报
回复
# -*- coding:utf-8 -*- """打开一个EXCEL格式的文件,对里面的相关内容进行遍历""" import xlrd import threading import _thread import socket, struct from IPy import IP import time def read_file(buf): frame=buf data=xlrd.open_workbook(frame) try: sh=data.sheet_by_name("已导出的系统") except: print("do not open Sheet1") return 0 """ncols=sh.ncols""" nrow=sh.nrows """print(ncols)""" """print(nrow)""" print("文件读取中……") i=1 i=int(i) while i<int(nrow): cell_A1 = sh.cell(i,3).value check_file(nrow,cell_A1) i=i+1 def check_file(buf1,sheet): """从列表中取得相关的IP字段,并与列表中的IP段进行比较,如果没有所存在的IP地址则写入,如果存在则计数+1""" file_sheet=sheet i=0 buf_No=0 if(file_sheet==""): return else: iplong=ip2long(file_sheet) if len(ip_longlist)==0: ip_longlist.append(iplong) ip_longlist.append(1) else: while i< int (len(ip_longlist)): checkIP=int(ip_longlist[i]) if(iplong==checkIP): """print(checkIP)""" i=i+1 """print("i" ,i)""" buf_No=ip_longlist[i] """ print("buf_No" ,buf_No)""" ip_longlist[i]=buf_No+1 """print(ip_longlist)""" return else: list_long=len(ip_longlist) list_long=int (list_long-1) """print(list_long)""" if(i==list_long): ip_longlist.append(iplong) ip_longlist.append(1) """print(ip_longlist)""" return else: i=i+1 def ip2long(ip): packedIP=socket.ntohl(struct.unpack("I",socket.inet_aton(ip))[0]) return packedIP def zhuanhan_ip(longIP): middle=[] middle=longIP buf_long=int(len(middle)) print(buf_long) print("ip 疯狂转化中") buf_long=buf_long for i in range(0,buf_long,2): iP_addr=middle[i] ip_list.append(socket.inet_ntoa(struct.pack('!L',iP_addr))) time.sleep(0.01) ip_list.append(middle[i+1]) def ip_printlist(buf): print(ip_list) _thread.lock.release() _thread.exit_thread() print("处理完成") def main(): read_file(buf) print("数据已经整理完成,IP转换中……") zhuanhan_ip(ip_longlist) try: ti=_thread.start_new(ip_printlist,(ip_list,)) print(ti) lock=_thread.allocate_lock() except: print ("Error: unable to start thread") if __name__=="__main__": ip_list=[] ip_longlist=[] buf='e:\\123.xls' print("信息正在处理中请稍后") main() 做了一定的修改,加了一个锁,但是好像有点不对,进行想等待线程执行完成后在退出程序,应该怎么搞啊,系统不报错,但是就是还没有打印,就退出了大大帮帮忙了
datianshi_1228 2014-03-28
  • 打赏
  • 举报
回复
我发现这个问题,但是我发现好像我的代码线程启动了 但是好像没有调整去执行比较函数。我在看看
angel_su 2014-03-28
  • 打赏
  • 举报
回复
你的代码里线程各自为政,主线程自然是立马接下来的代码,所以你还需要引入一些同步机制来控制执行顺序...
datianshi_1228 2014-03-28
  • 打赏
  • 举报
回复
关键现在的问题就是没有报错,但是好像线程所关联的函数没有启动,直接到 print("数据已经整理完成,IP转换中……") 这句了
angel_su 2014-03-28
  • 打赏
  • 举报
回复
最好贴出错误信息,_thread我不熟悉,貌似参数不匹配的样子,试试_thread.start_new(read_file,(buf,))...
datianshi_1228 2014-03-28
  • 打赏
  • 举报
回复
没有人啊,哪位大神帮帮我啊

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧