Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的Read.tar.gz文件_Python_File_Tar_Gzip - Fatal编程技术网

Python中的Read.tar.gz文件

Python中的Read.tar.gz文件,python,file,tar,gzip,Python,File,Tar,Gzip,我有一个25GB的文本文件。所以我把它压缩到tar.gz,变成了450MB。现在我想从python中读取该文件并处理文本数据。但在我的情况下,代码不起作用。代码如下: import tarfile import numpy as np tar = tarfile.open("filename.tar.gz", "r:gz") for member in tar.getmembers(): f=tar.extractfile(member) content = f.read

我有一个25GB的文本文件。所以我把它压缩到tar.gz,变成了450MB。现在我想从python中读取该文件并处理文本数据。但在我的情况下,代码不起作用。代码如下:

import tarfile
import numpy as np 

tar = tarfile.open("filename.tar.gz", "r:gz")
for member in tar.getmembers():
     f=tar.extractfile(member)
     content = f.read()
     Data = np.loadtxt(content)
Traceback (most recent call last):
  File "dataExtPlot.py", line 21, in <module>
    content = f.read()
AttributeError: 'NoneType' object has no attribute 'read'
错误如下:

import tarfile
import numpy as np 

tar = tarfile.open("filename.tar.gz", "r:gz")
for member in tar.getmembers():
     f=tar.extractfile(member)
     content = f.read()
     Data = np.loadtxt(content)
Traceback (most recent call last):
  File "dataExtPlot.py", line 21, in <module>
    content = f.read()
AttributeError: 'NoneType' object has no attribute 'read'
回溯(最近一次呼叫最后一次):
文件“dataExtPlot.py”,第21行,在
content=f.read()
AttributeError:“非类型”对象没有属性“读取”
另外,还有其他方法可以执行此任务吗?

如果成员不是常规文件或链接,则extractfile()将不返回任何方法

一种可能的解决方案是跳过“无”结果:

如果成员既不是文件也不是链接,则可以返回
None
。例如,您的tar存档可能包含目录或设备文件。要修复:

import tarfile
import numpy as np 

tar = tarfile.open("filename.tar.gz", "r:gz")
for member in tar.getmembers():
     f = tar.extractfile(member)
     if f:
         content = f.read()
         Data = np.loadtxt(content)
你可以试试这个

t = tarfile.open("filename.gz", "r")
for filename in t.getnames():
    try:
        f = t.extractfile(filename)
        Data = f.read()
        print filename, ':', Data
    except :
        print 'ERROR: Did not find %s in tar archive' % filename
您无法“读取”某些特殊文件(如链接)的内容,但tar支持这些文件,tarfile将正确提取它们。当
tarfile
提取它们时,它不会返回类似文件的对象,但不会返回任何对象。你会得到一个错误,因为你的tarball包含这样一个特殊的文件

一种方法是在提取tarball之前确定您正在处理的tarball中的条目类型:有了这些信息,您可以决定是否可以“读取”该文件。您可以通过调用
tarfile.getmembers()
返回
tarfile.TarInfo
s来实现这一点,其中包含有关tarball中包含的文件类型的详细信息

tarfile.TarInfo
类具有确定tar成员类型所需的所有属性和方法,例如
isfile()
isdir()
tinfo.islnk()
tinfo.issym()
,然后相应地决定如何处理每个成员(提取或不提取,等等)

例如,我使用这些来测试中的文件类型,以跳过提取特殊文件并以特殊方式处理链接:

for tinfo in tar.getmembers():
    is_special = not (tinfo.isfile() or tinfo.isdir()
                      or tinfo.islnk() or tinfo.issym())
...

在Jupyter笔记本中,您可以执行以下操作

!wget -c http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz -O - | tar -xz

我的需求:

with tarfile.open("sample.tar.gz", "r:gz") as tar:
for tarinfo in tar:
    logger.info(f"{tarinfo.name} is {tarinfo.size} bytes in size and is: ")
    if tarinfo.isreg():
        logger.info(f"Is regular file: {tarinfo.name}")
        f = tar.extractfile(tarinfo.name)  
        # To get the str instead of bytes str
        # Decode with proper coding, e.g. utf-8
        content = f.read().decode('utf-8', errors='ignore')
        # Split the long str into lines
        # Specify your line-sep: e.g. \n
        lines = content.split('\n')
        for i, line in enumerate(lines):
            print(f"[{i}]: {line}\n")
    elif tarinfo.isdir():
        logger.info(f"Is dir: {tarinfo.name}")
    else:
        logger.info(f"Is something else: {tarinfo.name}.")
  • 蟒蛇3
  • 我的tar.gz文件由多个
    utf-8
    文本文件和目录组成
  • 需要从所有文件中读取文本行
  • 问题:

  • tar.getmembers()返回的tar对象可能
    None
  • 内容
    extractfile(fname)
    返回的是字节str(例如b'Hello\t\xe4\xbd\xa0\xe5\xa5\xbd')。Unicode字符无法正确显示 解决方案:

    with tarfile.open("sample.tar.gz", "r:gz") as tar:
    for tarinfo in tar:
        logger.info(f"{tarinfo.name} is {tarinfo.size} bytes in size and is: ")
        if tarinfo.isreg():
            logger.info(f"Is regular file: {tarinfo.name}")
            f = tar.extractfile(tarinfo.name)  
            # To get the str instead of bytes str
            # Decode with proper coding, e.g. utf-8
            content = f.read().decode('utf-8', errors='ignore')
            # Split the long str into lines
            # Specify your line-sep: e.g. \n
            lines = content.split('\n')
            for i, line in enumerate(lines):
                print(f"[{i}]: {line}\n")
        elif tarinfo.isdir():
            logger.info(f"Is dir: {tarinfo.name}")
        else:
            logger.info(f"Is something else: {tarinfo.name}.")
    
  • 首先检查tar对象的类型。我引用了tarfile lib中的示例。(搜索“如何读取gzip压缩tar存档并显示一些成员信息”)
  • 从字节str解码为正常str.(-多数投票答案)
  • 代码:

    with tarfile.open("sample.tar.gz", "r:gz") as tar:
    for tarinfo in tar:
        logger.info(f"{tarinfo.name} is {tarinfo.size} bytes in size and is: ")
        if tarinfo.isreg():
            logger.info(f"Is regular file: {tarinfo.name}")
            f = tar.extractfile(tarinfo.name)  
            # To get the str instead of bytes str
            # Decode with proper coding, e.g. utf-8
            content = f.read().decode('utf-8', errors='ignore')
            # Split the long str into lines
            # Specify your line-sep: e.g. \n
            lines = content.split('\n')
            for i, line in enumerate(lines):
                print(f"[{i}]: {line}\n")
        elif tarinfo.isdir():
            logger.info(f"Is dir: {tarinfo.name}")
        else:
            logger.info(f"Is something else: {tarinfo.name}.")
    

    类似于如果成员不是上述任何一个,则不会返回任何成员。该成员不是文件或链接。感谢提供代码片段。不过,您要读取两次-一次是在设置“数据”变量时读取,下一次是在打印时读取。你能改变你的代码来解决这个问题吗?使用
    content=codecs.getreader(“utf-8”)(f)
    将ByTestStream转换成stringstream!资料来源: