pythonoffset
『壹』 python文件讀取中:f.seek(0)和f.seek(0,0)有什麼區別
seek(0)和f.seek(0,0)是沒有區別的。
file.seek()方法標准格式是:seek(offset,whence=0)offset:開始的偏移量,也就是代表需要移動偏移的位元組數whence:給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。默認為0
whence 的默認參數是0。
whence 還有兩種情況 是1,或者2:
1的時候,相對當前坐標的移動,可以是正的也可以是負的。
2的時候相對於文件結束的移動,通常應該是負的。
(1)pythonoffset擴展閱讀
python 文件讀寫操作:
讀文件
打開一個文件用open()方法(open()返回一個文件對象,它是可迭代的):
>>> f = open('test.txt', 'r')
r表示是文本文件,rb是二進制文件。(這個mode參數默認值就是r)
如果文件不存在,open()函數就會拋出一個IOError的錯誤,並且給出錯誤碼和詳細的信息告訴你文件不存在:
>>> f=open('test.txt', 'r')
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
文件使用完畢後必須關閉,因為文件對象會佔用操作系統的資源,並且操作系統同一時間能打開的文件數量也是有限的
>>> f.close()
由於文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用。
『貳』 python中的自加為什麼不對
因為for offset in range(0,9):將offset的值改成了0~8。
改成:
for i in range(0,9):
『叄』 python讀寫文件,如何將內容添加在文件開頭呢
fp.seek(offset[,whence])
#將文件打操作標記移到offset的位置。這個offset一般是相對於文件的開頭來計算的,一般為正數。但如果提供了whence參數就不一定了,whence可以為0表示從頭開始計算,1表示以當前位置為原點計算。2表示以文件末尾為原點進行計算。需要注意,如果文件以a或a+的模式打開,每次進行寫操作時,文件操作標記會自動返回到文件末尾。
『肆』 python處理滑動驗證碼,除了調用chrome
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import PIL.Image as image
import time,re, random
import requests
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
#爬蟲模擬的瀏覽器頭部信息
agent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'
headers = {
'User-Agent': agent
}
# 根據位置對圖片進行合並還原
# filename:圖片
# location_list:圖片位置
#內部兩個圖片處理函數的介紹
#crop函數帶的參數為(起始點的橫坐標,起始點的縱坐標,寬度,高度)
#paste函數的參數為(需要修改的圖片,粘貼的起始點的橫坐標,粘貼的起始點的縱坐標)
def get_merge_image(filename,location_list):
#打開圖片文件
im = image.open(filename)
#創建新的圖片,大小為260*116
new_im = image.new('RGB', (260,116))
im_list_upper=[]
im_list_down=[]
# 拷貝圖片
for location in location_list:
#上面的圖片
if location['y']==-58:
im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x'])+10,166)))
#下面的圖片
if location['y']==0:
im_list_down.append(im.crop((abs(location['x']),0,abs(location['x'])+10,58)))
new_im = image.new('RGB', (260,116))
x_offset = 0
#黏貼圖片
for im in im_list_upper:
new_im.paste(im, (x_offset,0))
x_offset += im.size[0]
x_offset = 0
for im in im_list_down:
new_im.paste(im, (x_offset,58))
x_offset += im.size[0]
return new_im
#下載並還原圖片
# driver:webdriver
# div:圖片的div
def get_image(driver,div):
#找到圖片所在的div
background_images=driver.find_elements_by_xpath(div)
location_list=[]
imageurl=''
#圖片是被CSS按照位移的方式打亂的,我們需要找出這些位移,為後續還原做好准備
for background_image in background_images:
location={}
#在html裡面解析出小圖片的url地址,還有長高的數值
location['x']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][1])
location['y']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][2])
imageurl=re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][0]
location_list.append(location)
#替換圖片的後綴,獲得圖片的URL
imageurl=imageurl.replace("webp","jpg")
#獲得圖片的名字
imageName = imageurl.split('/')[-1]
#獲得圖片
session = requests.session()
r = session.get(imageurl, headers = headers, verify = False)
#下載圖片
with open(imageName, 'wb') as f:
f.write(r.content)
f.close()
#重新合並還原圖片
image=get_merge_image(imageName, location_list)
return image
#對比RGB值
def is_similar(image1,image2,x,y):
pass
#獲取指定位置的RGB值
pixel1=image1.getpixel((x,y))
pixel2=image2.getpixel((x,y))
for i in range(0,3):
# 如果相差超過50則就認為找到了缺口的位置
if abs(pixel1[i]-pixel2[i])>=50:
return False
return True
#計算缺口的位置
def get_diff_location(image1,image2):
i=0
# 兩張原始圖的大小都是相同的260*116
# 那就通過兩個for循環依次對比每個像素點的RGB值
# 如果相差超過50則就認為找到了缺口的位置
for i in range(0,260):
for j in range(0,116):
if is_similar(image1,image2,i,j)==False:
return i
#根據缺口的位置模擬x軸移動的軌跡
def get_track(length):
pass
list=[]
#間隔通過隨機范圍函數來獲得,每次移動一步或者兩步
x=random.randint(1,3)
#生成軌跡並保存到list內
while length-x>=5:
list.append(x)
length=length-x
x=random.randint(1,3)
#最後五步都是一步步移動
for i in range(length):
list.append(1)
return list
#滑動驗證碼破解程序
def main():
#打開火狐瀏覽器
driver = webdriver.Firefox()
#用火狐瀏覽器打開網頁
driver.get("htest.com/exp_embed")
#等待頁面的上元素刷新出來
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']").is_displayed())
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_bg gt_show']").is_displayed())
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_fullbg gt_show']").is_displayed())
#下載圖片
image1=get_image(driver, "//div[@class='gt_cut_bg gt_show']/div")
image2=get_image(driver, "//div[@class='gt_cut_fullbg gt_show']/div")
#計算缺口位置
loc=get_diff_location(image1, image2)
#生成x的移動軌跡點
track_list=get_track(loc)
#找到滑動的圓球
element=driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']")
location=element.location
#獲得滑動圓球的高度
y=location['y']
#滑鼠點擊元素並按住不放
print ("第一步,點擊元素")
ActionChains(driver).click_and_hold(on_element=element).perform()
time.sleep(0.15)
print ("第二步,拖動元素")
track_string = ""
for track in track_list:
#不能移動太快,否則會被認為是程序執行
track_string = track_string + "{%d,%d}," % (track, y - 445)
#xoffset=track+22:這里的移動位置的值是相對於滑動圓球左上角的相對值,而軌跡變數里的是圓球的中心點,所以要加上圓球長度的一半。
#yoffset=y-445:這里也是一樣的。不過要注意的是不同的瀏覽器渲染出來的結果是不一樣的,要保證最終的計算後的值是22,也就是圓球高度的一半
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=track+22, yoffset=y-445).perform()
#間隔時間也通過隨機函數來獲得,間隔不能太快,否則會被認為是程序執行
time.sleep(random.randint(10,50)/100)
print (track_string)
#xoffset=21,本質就是向後退一格。這里退了5格是因為圓球的位置和滑動條的左邊緣有5格的距離
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
print ("第三步,釋放滑鼠")
#釋放滑鼠
ActionChains(driver).release(on_element=element).perform()
time.sleep(3)
#點擊驗證
# submit = driver.find_element_by_xpath("//div[@class='gt_ajax_tip success']")
# print(submit.location)
# time.sleep(5)
#關閉瀏覽器,為了演示方便,暫時注釋掉.
#driver.quit()
#主函數入口
if __name__ == '__main__':
pass
main()
『伍』 python平均值函數是什麼
python沒有提供求平均數的函數,建議先求和然後除以個數求得。
#!/usr/bin/env pythonimport timeimport numpy as np,dd = np.random.randint(0, 20, size=(2*1000*1000))t_start = time.clock()avg_sum1 =0.0BlockOffset = 0 while BlockOffset < len(dd):if dd[BlockOffset + 1] <= 10。
解釋性:
一個用編譯性語言比如C或C++寫的程序可以從源文件(即C或C++語言)轉換到一個你的計算機使用的語言(二進制代碼,即0和1)。這個過程通過編譯器和不同的標記、選項完成。
運行程序的時候,連接/轉載器軟體把你的程序從硬碟復制到內存中並且運行。而Python語言寫的程序不需要編譯成二進制代碼。你可以直接從源代碼運行 程序。
在計算機內部,Python解釋器把源代碼轉換成稱為位元組碼的中間形式,然後再把它翻譯成計算機使用的機器語言並運行。這使得使用Python更加簡單。也使得Python程序更加易於移植。
『陸』 Python菜鳥求助,文件操作問題
importcodecs
word="[ME]"
utf16file=codecs.open('utf-16le.txt','r',encoding='utf-16-le')
text=utf16file.read()
utf16file.close()
count=text.count(word)
newfile=codecs.open('new.txt','w',encoding='utf-16-le')
newfile.write(unichr(count).encode('utf-16-le'))
foriinrange(count):
newfile.write(unichr(0).encode('utf-16-le'))
newfile.write(text)
newfile.close()
offsetlist=[]
newfile=codecs.open('new.txt','r',encoding='utf-16-le')
text=newfile.read()
newfile.close()
length=len(word)
offset=text.find(word)
while(offset>=0):
offsetlist.append(offset+length-1)
offset=text.find(word,offset+length)
newfile=codecs.open('new.txt','r+',encoding='utf-16-le')
i=4L
foroffsetinoffsetlist:
newfile.seek(i)
newfile.write(unichr(offset).encode('utf-16-le'))
i+=4
newfile.close()
『柒』 python中回到文件的開頭
可以使用文件指針的seek()方法,此方法設置文件的當前位置偏移。它有兩個參數:
offset:文件的讀/寫指針位置偏移。
whence:這是可選的,默認為0,這意味著絕對的文件定位,值為1意味著相對於當前的位置,值為2意味著相對於文件的結束。
fp=open('meelo.txt')
data=fp.read()#讀取完文件內容後,指針指向文件結尾
fp.seek(0)#指針回到文件開頭
『捌』 如何使用python 連接kafka 並獲取數據
連接 kafka 的庫有兩種類型,一種是直接連接 kafka 的,存儲 offset 的事情要自己在客戶端完成。還有一種是先連接 zookeeper 然後再通過 zookeeper 獲取 kafka 的 brokers 信息, offset 存放在 zookeeper 上面,由 zookeeper 來協調。
我現在使用 samsa 這個 highlevel 庫
Procer示例
from kazoo.client import KazooClientfrom samsa.cluster import Clusterzookeeper = KazooClient()zookeeper.start()cluster = Cluster(zookeeper)topic = cluster.topics['topicname']topic.publish('msg')
** Consumer示例 **
from kazoo.client import KazooClientfrom samsa.cluster import Clusterzookeeper = KazooClient()zookeeper.start()cluster = Cluster(zookeeper)topic = cluster.topics['topicname']consumer = topic.subscribe('groupname')for msg in consumer:
print msg
Tip
consumer 必需在 procer 向 kafka 的 topic 裡面提交數據後才能連接,否則會出錯。
在 Kafka 中一個 consumer 需要指定 groupname , groue 中保存著 offset 等信息,新開啟一個 group 會從 offset 0 的位置重新開始獲取日誌。
kafka 的配置參數中有個 partition ,默認是 1 ,這個會對數據進行分區,如果多個 consumer 想連接同個 group 就必需要增加 partition , partition 只能大於 consumer 的數量,否則多出來的 consumer 將無法獲取到數據。