Вариант: извлечение файлов из файлов .tar в папке в другом файле .tar - PullRequest
2 голосов
/ 01 августа 2020

У меня есть файл .tar , содержащий 3 папки, из которых мне нужна только одна из них. В этой папке находятся текстовые файлы, которые также были сжаты в файлы .tar , и это файлы, которые я хочу распаковать / извлечь. Кроме того, мне нужна только половина этих текстовых файлов (те, которые заканчиваются на v8.EUR.signif_pairs.txt.gz).

Все, что мне удалось сделать, это извлечь папку, содержащую нужные мне файлы (они остаются сжатыми), выполнив следующим образом:

import tarfile
my_tar = tarfile.open('D:\\Large data files\\Stracquadanio data\\GTEx_Analysis_v8_eQTL_EUR.tar')
names = my_tar.getnames()
names_f = [x for x in names if 'v8.EUR.signif_pairs.txt.gz' in x]
my_tar.extractall(path = '../../data/interim/GTEx', members=[x for x in my_tar.getmembers() if x.name in names_f])
my_tar.close()

Даже тогда я получаю PermissionError , что означает, что только половина файлов, которые мне нужны, вообще извлекаются (26/49). Ошибка выглядит следующим образом:

PermissionError                           Traceback (most recent call last)
<ipython-input-63-7feeb8849e53> in <module>
      3 names = my_tar.getnames()
      4 names_f = [x for x in names if 'v8.EUR.signif_pairs.txt.gz' in x]
----> 5 my_tar.extractall(path = '../../data/interim/GTEx', members=[x for x in my_tar.getmembers() if x.name in names_f])
      6 my_tar.close()

~\anaconda3\lib\tarfile.py in extractall(self, path, members, numeric_owner)
   1998             # Do not set_attrs directories, as we will do that further down
   1999             self.extract(tarinfo, path, set_attrs=not tarinfo.isdir(),
-> 2000                          numeric_owner=numeric_owner)
   2001 
   2002         # Reverse sort directories.

~\anaconda3\lib\tarfile.py in extract(self, member, path, set_attrs, numeric_owner)
   2040             self._extract_member(tarinfo, os.path.join(path, tarinfo.name),
   2041                                  set_attrs=set_attrs,
-> 2042                                  numeric_owner=numeric_owner)
   2043         except OSError as e:
   2044             if self.errorlevel > 0:

~\anaconda3\lib\tarfile.py in _extract_member(self, tarinfo, targetpath, set_attrs, numeric_owner)
   2110 
   2111         if tarinfo.isreg():
-> 2112             self.makefile(tarinfo, targetpath)
   2113         elif tarinfo.isdir():
   2114             self.makedir(tarinfo, targetpath)

~\anaconda3\lib\tarfile.py in makefile(self, tarinfo, targetpath)
   2159                 target.truncate()
   2160             else:
-> 2161                 copyfileobj(source, target, tarinfo.size, ReadError, bufsize)
   2162 
   2163     def makeunknown(self, tarinfo, targetpath):

~\anaconda3\lib\tarfile.py in copyfileobj(src, dst, length, exception, bufsize)
    245     blocks, remainder = divmod(length, bufsize)
    246     for b in range(blocks):
--> 247         buf = src.read(bufsize)
    248         if len(buf) < bufsize:
    249             raise exception("unexpected end of data")

PermissionError: [Errno 13] Permission denied

Следовательно, у меня двоякая проблема:

  1. Как мне извлечь нужные текстовые файлы?
  2. Как мне Я устраняю ошибку PermissionError ? Это как-то связано с самими файлами или с моими методами?

Я понимаю, что могу сначала просто извлечь папку с текстовыми файлами, а затем извлечь файлы из этой папки, но тогда эти файлы будут занимать много места, когда я пытаюсь уменьшить объем дискового пространства, которое я использую с этим скриптом.

Я хотел бы добавить, что это было написано в Jupyter Notebooks на Windows 10, если это может быть проблемой. Кроме того, я ранее извлекал текстовые файлы вручную, поэтому для доступа к файлам нет какой-либо защиты или пароля.

...