Python 3:从 tar.gz 存档中提取文件
Python 3: extract files from tar.gz archive
我目前正在 Semantically Enriched Wikipedia 工作。
该资源位于一个 7.5 GB tar.gz 存档中,其中的每个文件都是一个 XML,其架构为:
<text>
Plain text
</text>
<annotation>
Annotation for plain text
</annotation>
当前任务是提取每个文件,然后解析标签内的内容。
我做的第一件事是使用 tarfile 模块及其 extractall() 方法,但是在提取我得到这个错误:
OSError: [Errno 22] Invalid argument: '.\sew_conservative\wiki384\Live_%3F%21*%40_Like_a_Suicide.xml'
虽然它的一部分被正确提取(我认为错误是由于 xml 文件名中的 unicode 字符引起的,但我现在看到每个文件都有它)。
所以我计划使用 API 的一些方法和下面的代码来处理存档中的每个文件。
不幸的是,包装每个文件的 TarInfo 对象不允许访问文件内容,并且一个文件一个文件地提取需要太多时间。
def parse_sew():
sew_path = Path("C:/Users/beppe/Desktop/Tesi/Semantically Enriched Wikipedia/sew_conservative.tar.gz")
with tarfile.open(sew_path, mode='r') as t:
for item in t:
// extraction
提取是强制性的以解析和使用 XML 文件的内容,还是可以读取存档内容(即时,不提取任何内容)然后解析内容?
更新:我正在通过 tar -xvzf filename.tar.gz 命令提取文件,一切正常,但 15 分钟后我只能处理 100 GB 中的 500MB。
我建议您使用 7zip 进行提取。您可以从 python 启动 7zip 提取,然后在并排提取时您可以阅读提取的文件。这将节省大量时间。您可以使用线程来实现。
其次,在提供 windows 路径时不要使用前斜杠。您可以使用 \
代替 /
。
您也可以尝试使用 shutil 如下。
shutil.unpack_archive('path_to_your_archive', 'path_to_extract')
我目前正在 Semantically Enriched Wikipedia 工作。
该资源位于一个 7.5 GB tar.gz 存档中,其中的每个文件都是一个 XML,其架构为:
<text>
Plain text
</text>
<annotation>
Annotation for plain text
</annotation>
当前任务是提取每个文件,然后解析标签内的内容。
我做的第一件事是使用 tarfile 模块及其 extractall() 方法,但是在提取我得到这个错误:
OSError: [Errno 22] Invalid argument: '.\sew_conservative\wiki384\Live_%3F%21*%40_Like_a_Suicide.xml'
虽然它的一部分被正确提取(我认为错误是由于 xml 文件名中的 unicode 字符引起的,但我现在看到每个文件都有它)。
所以我计划使用 API 的一些方法和下面的代码来处理存档中的每个文件。
不幸的是,包装每个文件的 TarInfo 对象不允许访问文件内容,并且一个文件一个文件地提取需要太多时间。
def parse_sew():
sew_path = Path("C:/Users/beppe/Desktop/Tesi/Semantically Enriched Wikipedia/sew_conservative.tar.gz")
with tarfile.open(sew_path, mode='r') as t:
for item in t:
// extraction
提取是强制性的以解析和使用 XML 文件的内容,还是可以读取存档内容(即时,不提取任何内容)然后解析内容?
更新:我正在通过 tar -xvzf filename.tar.gz 命令提取文件,一切正常,但 15 分钟后我只能处理 100 GB 中的 500MB。
我建议您使用 7zip 进行提取。您可以从 python 启动 7zip 提取,然后在并排提取时您可以阅读提取的文件。这将节省大量时间。您可以使用线程来实现。
其次,在提供 windows 路径时不要使用前斜杠。您可以使用 \
代替 /
。
您也可以尝试使用 shutil 如下。
shutil.unpack_archive('path_to_your_archive', 'path_to_extract')