Skip to content

Commit 8eb6e02

Browse files
author
Kazuki Suzuki Przyborowski
committed
Update pyfoxfile.py
1 parent 117ad06 commit 8eb6e02

1 file changed

Lines changed: 98 additions & 55 deletions

File tree

pyfoxfile.py

Lines changed: 98 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5808,88 +5808,131 @@ def CheckCompressionTypeFromBytes(instring, formatspecs=__file_format_multi_dict
58085808
return CheckCompressionType(instringsfile, formatspecs, filestart, closefp)
58095809

58105810

5811-
def UncompressFileAlt(fp, formatspecs=__file_format_multi_dict__, filestart=0):
5812-
if(not hasattr(fp, "read")):
5811+
def UncompressFileAlt(fp, formatspecs=__file_format_multi_dict__, filestart=0,
5812+
use_mmap=False):
5813+
"""
5814+
Accepts an already-open *bytes* file-like (fp). Detects compression and
5815+
returns a FileLikeAdapter opened for 'rb'. If the stream is uncompressed
5816+
and backed by a real file, you can enable mmap via use_mmap=True.
5817+
"""
5818+
if not hasattr(fp, "read"):
58135819
return False
5820+
5821+
# Detect format on the fileobj at filestart
58145822
compresscheck = CheckCompressionType(fp, formatspecs, filestart, False)
5815-
if(IsNestedDict(formatspecs) and compresscheck in formatspecs):
5823+
if IsNestedDict(formatspecs) and compresscheck in formatspecs:
58165824
formatspecs = formatspecs[compresscheck]
5817-
if(compresscheck == "gzip" and compresscheck in compressionsupport):
5825+
5826+
# Build the appropriate decompressor stream (or pass-through)
5827+
if (compresscheck == "gzip" and compresscheck in compressionsupport):
58185828
fp = gzip.GzipFile(fileobj=fp, mode="rb")
5819-
elif(compresscheck == "bzip2" and compresscheck in compressionsupport):
5829+
elif (compresscheck == "bzip2" and compresscheck in compressionsupport):
58205830
fp = bz2.BZ2File(fp)
5821-
elif(compresscheck == "zstd" and compresscheck in compressionsupport):
5831+
elif (compresscheck == "zstd" and compresscheck in compressionsupport):
58225832
if 'zstandard' in sys.modules:
58235833
fp = ZstdFile(fileobj=fp, mode="rb")
58245834
elif 'pyzstd' in sys.modules:
58255835
fp = pyzstd.zstdfile.ZstdFile(fileobj=fp, mode="rb")
58265836
else:
5827-
return Flase
5828-
elif(compresscheck == "lz4" and compresscheck in compressionsupport):
5837+
return False
5838+
elif (compresscheck == "lz4" and compresscheck in compressionsupport):
58295839
fp = lz4.frame.LZ4FrameFile(fp, mode='rb')
5830-
elif((compresscheck == "lzo" or compresscheck == "lzop") and compresscheck in compressionsupport):
5840+
elif ((compresscheck == "lzo" or compresscheck == "lzop") and compresscheck in compressionsupport):
58315841
fp = LzopFile(fileobj=fp, mode="rb")
5832-
elif((compresscheck == "lzma" or compresscheck == "xz") and compresscheck in compressionsupport):
5842+
elif ((compresscheck == "lzma" or compresscheck == "xz") and compresscheck in compressionsupport):
58335843
fp = lzma.LZMAFile(fp)
5834-
elif(compresscheck == "zlib" and compresscheck in compressionsupport):
5844+
elif (compresscheck == "zlib" and compresscheck in compressionsupport):
58355845
fp = ZlibFile(fileobj=fp, mode="rb")
5836-
elif(compresscheck == formatspecs['format_magic']):
5837-
fp = fp
5838-
elif(not compresscheck):
5846+
else:
5847+
# Either magic matched your format OR no compression detected:
5848+
# pass-through original fp.
5849+
fp.seek(filestart, 0)
5850+
5851+
# Wrap in FileLikeAdapter; optionally mmap only if uncompressed + real file
5852+
mm = None
5853+
if use_mmap and compresscheck in (None, formatspecs.get('format_magic', None)):
5854+
base = _extract_base_fp(fp)
58395855
try:
5840-
fp = lz4.frame.LZ4FrameFile(fp, mode='rb')
5841-
except lzma.LZMAError:
5842-
return False
5843-
if(compresscheck != formatspecs['format_magic']):
5844-
fp.close()
5845-
return fp
5856+
if base is not None:
5857+
# Map whole file for read-only; keep base open via adapter
5858+
mm = mmap.mmap(base.fileno(), 0, access=mmap.ACCESS_READ)
5859+
except Exception:
5860+
mm = None # silently fall back to streaming
58465861

5862+
# Always position at start of logical stream
5863+
try:
5864+
fp.seek(0, 0)
5865+
except Exception:
5866+
pass
5867+
5868+
return FileLikeAdapter(fp, mode="rb", mm=mm)
58475869

5848-
def UncompressFile(infile, formatspecs=__file_format_multi_dict__, mode="rb", filestart=0):
5870+
def UncompressFile(infile, formatspecs=__file_format_multi_dict__, mode="rb",
5871+
filestart=0, use_mmap=False):
5872+
"""
5873+
Opens a path, detects compression by header, and returns a FileLikeAdapter.
5874+
If uncompressed and use_mmap=True, returns an mmap-backed reader.
5875+
"""
58495876
compresscheck = CheckCompressionType(infile, formatspecs, filestart, False)
5850-
if(IsNestedDict(formatspecs) and compresscheck in formatspecs):
5877+
if IsNestedDict(formatspecs) and compresscheck in formatspecs:
58515878
formatspecs = formatspecs[compresscheck]
5852-
if(sys.version_info[0] == 2 and compresscheck):
5853-
if(mode == "rt"):
5854-
mode = "r"
5855-
elif(mode == "wt"):
5856-
mode = "w"
5879+
5880+
# Python 2 text-mode fixups if needed (though you're bytes-only)
5881+
if sys.version_info[0] == 2 and compresscheck:
5882+
if mode == "rt": mode = "r"
5883+
elif mode == "wt": mode = "w"
5884+
58575885
try:
5858-
if(compresscheck == "gzip" and compresscheck in compressionsupport):
5859-
if sys.version_info[0] == 2:
5860-
filefp = GzipFile(infile, mode=mode)
5861-
else:
5862-
filefp = gzip.open(infile, mode)
5863-
elif(compresscheck == "bzip2" and compresscheck in compressionsupport):
5864-
filefp = bz2.open(infile, mode)
5865-
elif(compresscheck == "zstd" and compresscheck in compressionsupport):
5886+
# Compressed branches
5887+
if (compresscheck == "gzip" and "gzip" in compressionsupport):
5888+
fp = GzipFile(infile, mode=mode) if sys.version_info[0] == 2 else gzip.open(infile, mode)
5889+
elif (compresscheck == "bzip2" and "bzip2" in compressionsupport):
5890+
fp = bz2.open(infile, mode)
5891+
elif (compresscheck == "zstd" and "zstandard" in compressionsupport):
58665892
if 'zstandard' in sys.modules:
5867-
filefp = ZstdFile(infile, mode=mode)
5893+
fp = ZstdFile(infile, mode=mode)
58685894
elif 'pyzstd' in sys.modules:
5869-
filefp = pyzstd.zstdfile.ZstdFile(infile, mode=mode)
5895+
fp = pyzstd.zstdfile.ZstdFile(infile, mode=mode)
58705896
else:
5871-
return Flase
5872-
elif(compresscheck == "lz4" and compresscheck in compressionsupport):
5873-
filefp = lz4.frame.open(infile, mode)
5874-
elif((compresscheck == "lzo" or compresscheck == "lzop") and compresscheck in compressionsupport):
5875-
filefp = LzopFile(infile, mode=mode)
5876-
elif((compresscheck == "lzma" or compresscheck == "xz") and compresscheck in compressionsupport):
5877-
filefp = lzma.open(infile, mode)
5878-
elif(compresscheck == "zlib" and compresscheck in compressionsupport):
5879-
filefp = ZlibFile(infile, mode=mode)
5880-
elif(compresscheck == formatspecs['format_magic']):
5881-
filefp = open(infile, mode)
5882-
elif(not compresscheck):
5883-
filefp = open(infile, mode)
5884-
else:
5885-
filefp = open(infile, mode)
5897+
return False
5898+
elif (compresscheck == "lz4" and "lz4" in compressionsupport):
5899+
fp = lz4.frame.open(infile, mode)
5900+
elif ((compresscheck == "lzo" or compresscheck == "lzop") and "lzop" in compressionsupport):
5901+
fp = LzopFile(infile, mode=mode)
5902+
elif ((compresscheck == "lzma" or compresscheck == "xz") and "xz" in compressionsupport):
5903+
fp = lzma.open(infile, mode)
5904+
elif (compresscheck == "zlib" and "zlib" in compressionsupport):
5905+
fp = ZlibFile(infile, mode=mode)
5906+
5907+
# Uncompressed (or unknown): open plain file
5908+
else:
5909+
fp = open(infile, mode)
5910+
58865911
except FileNotFoundError:
58875912
return False
5913+
5914+
# For uncompressed: optional mmap
5915+
mm = None
5916+
if use_mmap and (compresscheck is None or compresscheck == formatspecs.get('format_magic', None)):
5917+
try:
5918+
base = _extract_base_fp(fp)
5919+
if base is not None:
5920+
mm = mmap.mmap(base.fileno(), 0, access=mmap.ACCESS_READ if "r" in mode else mmap.ACCESS_WRITE)
5921+
except Exception:
5922+
mm = None # fallback to normal file stream
5923+
5924+
# Position to filestart if caller requested it (mainly for fileobj-based headers)
58885925
try:
5889-
filefp.write_through = True
5890-
except AttributeError:
5926+
fp.seek(0 if compresscheck else filestart, 0)
5927+
except Exception:
58915928
pass
5892-
return filefp
5929+
5930+
out = FileLikeAdapter(fp, mode="rb" if "r" in mode else "wb", mm=mm)
5931+
try:
5932+
out.write_through = True
5933+
except Exception:
5934+
pass
5935+
return out
58935936

58945937

58955938
def UncompressString(infile, formatspecs=__file_format_multi_dict__, filestart=0):

0 commit comments

Comments
 (0)