導航:首頁 > 文件處理 > pythongzip壓縮

pythongzip壓縮

發布時間:2022-09-25 05:54:02

『壹』 python如何讀取通過gzip壓縮的字元串

import osimport gzip # 那是因為你調用了read方法,而這個方法會把文件一股腦兒讀取出來的# 為了便於你迭代,你可以在這里使用一個生成器def read_gz_file(path): if os.path.exists(path): with gzip.open(path, 'rt') as pf: for line in pf: yield line else: print('the path [{}] is not exist!'.format(path)) con = read_gz_file('abc.gz')if getattr(con, '__iter__', None): for line in con: print(line, end = '')

『貳』 python壓縮成tar

Python壓縮文件為tar、gzip的方源碼。需要應用到os、tarfile、gzip、string、shutil這幾個Python類庫中的方法。不同於Python Gzip壓縮與解壓模塊,今天我們要用自己的方法實現壓...

『叄』 為什麼用Python爬知乎是亂碼

這是因為知乎將網頁數據做了gzip壓縮。解壓之後就可以了。


import sys

import urllib2

import StringIO, gzip


reload(sys)

sys.setdefaultencoding("utf-8")


def decodeGzip(data):

stream = StringIO.StringIO(data)

gziper = gzip.GzipFile(fileobj=stream)

return gziper.read()


#此處填鏈接,網路可能會屏蔽鏈接所以把鏈接內容省略了

url = ""


resp = urllib2.urlopen(url)


text = resp.read()


print decodeGzip(text)

『肆』 哪位哥哥能給個python中 tarfile,gzip,zlib 用法的代碼

tarfile:

importtarfile
tar=tarfile.open("sample.tar.gz")
tar.extractall()
tar.close()

gzip

importgzip
f=gzip.open('file.txt.gz','rb')
file_content=f.read()
f.close()

zlib

#https://docs.python.org/2.7/library/zlib.html

如果解決了您的問題請採納!
如果未解決請繼續追問

『伍』 如何使用python爬蟲jfinal

一、gzip/deflate支持

現在的網頁普遍支持gzip壓縮,這往往可以解決大量傳輸時間,以VeryCD的主頁為例,未壓縮版本247K,壓縮了以後45K,為原來的1/5。這就意味著抓取速度會快5倍。

然而python的urllib/urllib2默認都不支持壓縮,要返回壓縮格式,必須在request的header裡面寫明』accept-
encoding』,然後讀取response後更要檢查header查看是否有』content-encoding』一項來判斷是否需要解碼,很繁瑣瑣
碎。如何讓urllib2自動支持gzip, defalte呢?

其實可以繼承BaseHanlder類,然後build_opener的方式來處理:

import urllib2
from gzip import GzipFile
from StringIO import StringIO
class ContentEncodingProcessor(urllib2.BaseHandler):
"""A handler to add gzip capabilities to urllib2 requests """

# add headers to requests
def http_request(self, req):
req.add_header("Accept-Encoding", "gzip, deflate")
return req

# decode
def http_response(self, req, resp):
old_resp = resp
# gzip
if resp.headers.get("content-encoding") == "gzip":
gz = GzipFile(
fileobj=StringIO(resp.read()),
mode="r"
)
resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code)
resp.msg = old_resp.msg
# deflate
if resp.headers.get("content-encoding") == "deflate":
gz = StringIO( deflate(resp.read()) )
resp = urllib2.addinfourl(gz, old_resp.headers, old_resp.url, old_resp.code) # 'class to add info() and
resp.msg = old_resp.msg
return resp

# deflate support
import zlib
def deflate(data): # zlib only provides the zlib compress format,not the deflate format;
try: # so on top of all there's this workaround:
return zlib.decompress(data, -zlib.MAX_WBITS)
except zlib.error:
return zlib.decompress(data)

然後就簡單了,

encoding_support = ContentEncodingProcessor
opener = urllib2.build_opener( encoding_support, urllib2.HTTPHandler )

#直接用opener打開網頁,如果伺服器支持gzip/defalte則自動解壓縮
content = opener.open(url).read()

二、更方便地多線程

總結一文的確提及了一個簡單的多線程模板,但是那個東東真正應用到程序裡面去只會讓程序變得支離破碎,不堪入目。在怎麼更方便地進行多線程方面我也動了一番腦筋。先想想怎麼進行多線程調用最方便呢?

1、用twisted進行非同步I/O抓取

事實上更高效的抓取並非一定要用多線程,也可以使用非同步I/O法:直接用twisted的getPage方法,然後分別加上非同步I/O結束時的callback和errback方法即可。例如可以這么干:

from twisted.web.client import getPage
from twisted.internet import reactor

links = [ 'http://www.verycd.com/topics/%d/'%i for i in range(5420,5430) ]

def parse_page(data,url):
print len(data),url

def fetch_error(error,url):
print error.getErrorMessage(),url

# 批量抓取鏈接
for url in links:
getPage(url,timeout=5)
.addCallback(parse_page,url) #成功則調用parse_page方法
.addErrback(fetch_error,url) #失敗則調用fetch_error方法

reactor.callLater(5, reactor.stop) #5秒鍾後通知reactor結束程序
reactor.run()

twisted人如其名,寫的代碼實在是太扭曲了,非正常人所能接受,雖然這個簡單的例子看上去還好;每次寫twisted的程序整個人都扭曲了,累得不得了,文檔等於沒有,必須得看源碼才知道怎麼整,唉不提了。

如果要支持gzip/deflate,甚至做一些登陸的擴展,就得為twisted寫個新的HTTPClientFactory類諸如此類,我這眉頭真是大皺,遂放棄。有毅力者請自行嘗試。

這篇講怎麼用twisted來進行批量網址處理的文章不錯,由淺入深,深入淺出,可以一看。

2、設計一個簡單的多線程抓取類

還是覺得在urllib之類python「本土」的東東裡面折騰起來更舒服。試想一下,如果有個Fetcher類,你可以這么調用

f = Fetcher(threads=10) #設定下載線程數為10
for url in urls:
f.push(url) #把所有url推入下載隊列
while f.taskleft(): #若還有未完成下載的線程
content = f.pop() #從下載完成隊列中取出結果
do_with(content) # 處理content內容

這么個多線程調用簡單明了,那麼就這么設計吧,首先要有兩個隊列,用Queue搞定,多線程的基本架構也和「技巧總結」一文類似,push方法和
pop方法都比較好處理,都是直接用Queue的方法,taskleft則是如果有「正在運行的任務」或者」隊列中的任務」則為是,也好辦,於是代碼如
下:

import urllib2
from threading import Thread,Lock
from Queue import Queue
import time

class Fetcher:
def __init__(self,threads):
self.opener = urllib2.build_opener(urllib2.HTTPHandler)
self.lock = Lock() #線程鎖
self.q_req = Queue() #任務隊列
self.q_ans = Queue() #完成隊列
self.threads = threads
for i in range(threads):
t = Thread(target=self.threadget)
t.setDaemon(True)
t.start()
self.running = 0

def __del__(self): #解構時需等待兩個隊列完成
time.sleep(0.5)
self.q_req.join()
self.q_ans.join()

def taskleft(self):
return self.q_req.qsize()+self.q_ans.qsize()+self.running

def push(self,req):
self.q_req.put(req)

def pop(self):
return self.q_ans.get()

def threadget(self):
while True:
req = self.q_req.get()
with self.lock: #要保證該操作的原子性,進入critical area
self.running += 1
try:
ans = self.opener.open(req).read()
except Exception, what:
ans = ''
print what
self.q_ans.put((req,ans))
with self.lock:
self.running -= 1
self.q_req.task_done()
time.sleep(0.1) # don't spam

if __name__ == "__main__":
links = [ 'http://www.verycd.com/topics/%d/'%i for i in range(5420,5430) ]
f = Fetcher(threads=10)
for url in links:
f.push(url)
while f.taskleft():
url,content = f.pop()
print url,len(content)


『陸』 python如何判斷一個文件是否為gzip文件

本文實例講述了Python實現壓縮與解壓gzip大文件的方法。分享給大家供大家參考,具體如下:
#encoding=utf-8
#author: walker
#date: 2015-10-26
#summary: 測試gzip壓縮/解壓文件
import gzip
BufSize = 1024*8
def gZipFile(src, dst):
fin = open(src, 'rb')
fout = gzip.open(dst, 'wb')
in2out(fin, fout)
def gunZipFile(gzFile, dst):
fin = gzip.open(gzFile, 'rb')
fout = open(dst, 'wb')
in2out(fin, fout)
def in2out(fin, fout):
while True:
buf = fin.read(BufSize)
if len(buf) < 1:
break
fout.write(buf)
fin.close()
fout.close()
if __name__ == '__main__':
src = r'D:\tmp\src.txt'
dst = r'D:\tmp\src.txt.gz'
ori = r'D:\tmp\ori.txt'
gZipFile(src, dst)
print('gZipFile over!')
gunZipFile(dst, ori)
print('gunZipFile over!')

也可以簡單地封裝成一個類:
class GZipTool:
def __init__(self, bufSize):
self.bufSize = bufSize
self.fin = None
self.fout = None
def compress(self, src, dst):
self.fin = open(src, 'rb')
self.fout = gzip.open(dst, 'wb')
self.__in2out()
def decompress(self, gzFile, dst):
self.fin = gzip.open(gzFile, 'rb')
self.fout = open(dst, 'wb')
self.__in2out()
def __in2out(self,):
while True:
buf = self.fin.read(self.bufSize)
if len(buf) < 1:
break
self.fout.write(buf)
self.fin.close()
self.fout.close()

『柒』 怎麼樣python爬蟲進行此網站爬取

『捌』 python中accept-encoding gzip deflate怎樣解壓

看你的請求頭 GET /xxxx/xxxx/ HTTP/1.1 Accept-Encoding: gzip,deflate,sdch 是不是有這個,gzip 如果是這個就是亂碼 因為是壓縮的,你把這個gzip去了就行了

『玖』 java gzip 和 python gzip 有什麼區別

一個zip可以內藏多個文件 狹義的gzip僅對單個文件壓縮,不能打包多個文件。 tar.gzip或tgz可以打包多個文件,屬於固實壓縮,壓縮比較高,但隨機存取單個文件的效率不如zip..

閱讀全文

與pythongzip壓縮相關的資料

熱點內容
現代父子訓誡文 瀏覽:638
psef如何查看伺服器是否啟動 瀏覽:594
安卓手機如何投屏逍客 瀏覽:165
兒子干後媽的電影叫什麼 瀏覽:17
日韓在線資源中文字幕免費 瀏覽:143
第一彈app怎麼清除瀏覽歷史 瀏覽:898
1980法國電影少年的秘密 瀏覽:953
滿清十部電影大全 瀏覽:292
周末夫妻演員 瀏覽:345
末世之一女多男推薦 瀏覽:567
電腦VIP影視 瀏覽:395
看電影不要會員的網站 瀏覽:894
已知演算法文法G如下S 瀏覽:710
程序員周先生彩票 瀏覽:837
免費韓國中文倫理電影 瀏覽:975
大上海片尾曲 瀏覽:35
在哪裡可以看vr電視劇免費 瀏覽:15
steam的啟動項在文件夾的哪裡 瀏覽:375
午夜宅男看片網站 瀏覽:491
煤氣解壓伐不是加減調節是數字 瀏覽:123