У меня есть файл .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
Следовательно, у меня двоякая проблема:
- Как мне извлечь нужные текстовые файлы?
- Как мне Я устраняю ошибку PermissionError ? Это как-то связано с самими файлами или с моими методами?
Я понимаю, что могу сначала просто извлечь папку с текстовыми файлами, а затем извлечь файлы из этой папки, но тогда эти файлы будут занимать много места, когда я пытаюсь уменьшить объем дискового пространства, которое я использую с этим скриптом.
Я хотел бы добавить, что это было написано в Jupyter Notebooks на Windows 10, если это может быть проблемой. Кроме того, я ранее извлекал текстовые файлы вручную, поэтому для доступа к файлам нет какой-либо защиты или пароля.