第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

fileinput.hook_compressed 有時(shí)給我字符串,有時(shí)給我字節(jié)

fileinput.hook_compressed 有時(shí)給我字符串,有時(shí)給我字節(jié)

交互式愛(ài)情 2023-09-12 19:52:57
我正在嘗試從多個(gè)文件中讀取行。有些是 gzip 壓縮的,有些是純文本文件。在Python 2.7中,我一直在使用以下代碼并且它有效:for line in fileinput.input(filenames, openhook=fileinput.hook_compressed):    match = REGEX.match(line)    if (match):        # do things with line...現(xiàn)在我轉(zhuǎn)移到Python 3.8,它仍然可以正常處理純文本文件,但是當(dāng)它遇到gzipped文件時(shí),我收到以下錯(cuò)誤:TypeError: cannot use a string pattern on a bytes-like object解決這個(gè)問(wèn)題的最佳方法是什么?我知道我可以檢查是否line是一個(gè)字節(jié)對(duì)象并將其解碼為字符串,但我寧愿使用一些標(biāo)志來(lái)自動(dòng)始終將行迭代為字符串(如果可能);而且,我更喜歡編寫同時(shí)適用于 Python 2 和 3 的代碼。
查看完整描述

2 回答

?
繁花不似錦

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊

fileinput.input根據(jù)是否獲取 gzip 壓縮文件,執(zhí)行根本不同的操作。對(duì)于文本文件,它以常規(guī)打開open,默認(rèn)情況下以文本模式有效打開。對(duì)于gzip.open,默認(rèn)模式是二進(jìn)制,這對(duì)于內(nèi)容未知的壓縮文件來(lái)說(shuō)是合理的。

僅二進(jìn)制限制是由 人為施加的fileinput.FileInput。從該方法的代碼來(lái)看__init__

? # restrict mode argument to reading modes

? ?if mode not in ('r', 'rU', 'U', 'rb'):

? ? ? ?raise ValueError("FileInput opening mode must be one of "

? ? ? ? ? ? ? ? ? ? ? ? "'r', 'rU', 'U' and 'rb'")

? ?if 'U' in mode:

? ? ? ?import warnings

? ? ? ?warnings.warn("'U' mode is deprecated",

? ? ? ? ? ? ? ? ? ? ?DeprecationWarning, 2)

? ?self._mode = mode

這為您提供了兩種解決方法。


選項(xiàng)1


設(shè)置_mode后的屬性__init__。為了避免在使用中添加額外的代碼行,您可以子類化fileinput.FileInput并直接使用該類:


class TextFileInput(fileinput.FileInput):

? ? def __init__(*args, **kwargs):

? ? ? ? if 'mode' in kwargs and 't' in kwargs['mode']:

? ? ? ? ? ? mode = kwargs.pop['mode']

? ? ? ? else:

? ? ? ? ? ? mode = ''

? ? ? ? super().__init__(*args, **kwargs)

? ? ? ? if mode:

? ? ? ? ? ? self._mode = mode


for line in TextFileInput(filenames, openhook=fileinput.hook_compressed, mode='rt'):

? ? ...

選項(xiàng)2


弄亂未記錄的前導(dǎo)下劃線非常麻煩,因此您可以為 zip 文件創(chuàng)建自定義掛鉤。這實(shí)際上非常簡(jiǎn)單,因?yàn)槟梢允褂么a作為fileinput.hook_compressed模板:


def my_hook_compressed(filename, mode):

? ? if 'b' not in mode:

? ? ? ? mode += 't'

? ? ext = os.path.splitext(filename)[1]

? ? if ext == '.gz':

? ? ? ? import gzip

? ? ? ? return gzip.open(filename, mode)

? ? elif ext == '.bz2':

? ? ? ? import bz2

? ? ? ? return bz2.open(filename, mode)

? ? else:

? ? ? ? return open(filename, mode)

選項(xiàng)3


最后,您始終可以將字節(jié)解碼為 unicode 字符串。這顯然不是更好的選擇。


查看完整回答
反對(duì) 回復(fù) 2023-09-12
?
GCT1015

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊

def my_hook_compressed(filename, mode):

? ? """hook for fileinput so we can also handle compressed files seamlessly"""

? ? if 'b' not in mode:

? ? ? ? mode += 't'

? ? ext = os.path.splitext(filename)[1]

? ? if ext == '.gz':

? ? ? ? import gzip

? ? ? ? return gzip.open(filename, mode)

? ? elif ext == '.bz2':

? ? ? ? import bz2

? ? ? ? return bz2.open(filename, mode)

? ? elif ext == '.xz':

? ? ? ? import lzma

? ? ? ? return lzma.open(filename, mode)

? ? elif ext == '.zst':

? ? ? ? import zstandard, io

? ? ? ? compressed = open(filename, 'rb')

? ? ? ? decompressor = zstandard.ZstdDecompressor()

? ? ? ? stream_reader = decompressor.stream_reader(compressed)

? ? ? ? return io.TextIOWrapper(stream_reader)

? ? else:

? ? ? ? return open(filename, mode)

我沒(méi)有在 2.7 上測(cè)試過(guò),但這適用于 3.8+


for line in fileinput.input(filenames, openhook=my_hook_compressed):

? ? ...


查看完整回答
反對(duì) 回復(fù) 2023-09-12
  • 2 回答
  • 0 關(guān)注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)