PermissionError: [Errno 13] Отказано в доступе, когда я использую shutil.copy () для копирования файла csv из одной папки в другую - PullRequest
0 голосов
/ 30 сентября 2019

Я просто пытаюсь скопировать файлы с уникальным именем группы после второго _. Всего таких групп три. Я пытаюсь разделить их на 3 разные папки. У меня были проблемы с shutil.copy. Python версии 3.

КОД:

#
import os, os.path, shutil

folder_path = 'nodelists'
all_cells = [f for f in os.listdir(folder_path) if 
os.path.isfile(os.path.join(folder_path, f))]
print("Length of all cells:",len(all_cells))

count=0
for cell in all_cells:
    folder_name = cell.split('_')[2]
    new_path = folder_name+"_nodelists"
    if not os.path.exists(new_path):
        os.mkdir(new_path)

    old_cell_path = os.path.join(folder_path, cell)
    shutil.copy(old_cell_path,new_path)

    count+=1

    if count % 500 == 0:
        print ("Progress:",count, " done")
        print("cell id is", str(cell))
### ВЫХОД:
Length of all cells: 15533
Progress: 500  done
cell id is AAGCGTTCAACTAGAA-1_nodelist_old_.csv
Progress: 1000  done
...
DISPLAYS RESULTS CORRECTLY! I am even able to open and check these files.##
...
Progress: 9500  done
cell id is GGGACCTAGCGACTAG-1_nodelist_postnatal_.csv

---------------------------------------------------------------------------
PermissionError                           Traceback (most recent call last)
<ipython-input-2-90d1a4cf5db0> in <module>()
     20     #new_cell_path = os.path.join(new_path, cell)
     21     #shutil.copy(old_cell_path, new_cell_path)
---> 22     shutil.copy(old_cell_path,new_path)
     23 
     24     count+=1

~\AppData\Local\Continuum\anaconda3\lib\shutil.py in copy(src, dst, follow_symlinks)
    239     if os.path.isdir(dst):
    240         dst = os.path.join(dst, os.path.basename(src))
--> 241     copyfile(src, dst, follow_symlinks=follow_symlinks)
    242     copymode(src, dst, follow_symlinks=follow_symlinks)
    243     return dst

~\AppData\Local\Continuum\anaconda3\lib\shutil.py in copyfile(src, dst, follow_symlinks)
    120         with open(src, 'rb') as fsrc:
    121             with open(dst, 'wb') as fdst:
--> 122                 copyfileobj(fsrc, fdst)
    123     return dst
    124 

~\AppData\Local\Continuum\anaconda3\lib\shutil.py in copyfileobj(fsrc, fdst, length)
     77     """copy data from file-like object fsrc to file-like object fdst"""
     78     while 1:
---> 79         buf = fsrc.read(length)
     80         if not buf:
     81             break

PermissionError: [Errno 13] Permission denied
#

Я попытался дать разрешение Jupyter с помощью «Запуск от имени администратора». Это все еще не проходило. Я использую Windows 10 и не смог найти вкладку безопасности для своих папок. Все эти папки находятся в моей папке синхронизации BOX.

Любая помощь очень ценится!

РЕДАКТИРОВАТЬ: После того, как я попробовал: попробуйте / за исключением PermissionError, я теперь получаю:

---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-8-909c0ceea90a> in <module>()
     19 
     20     try:
---> 21         shutil.copy(old_cell_path,new_path)
     22 
     23     except PermissionError as error:

~\AppData\Local\Continuum\anaconda3\lib\shutil.py in copy(src, dst, follow_symlinks)
    239     if os.path.isdir(dst):
    240         dst = os.path.join(dst, os.path.basename(src))
--> 241     copyfile(src, dst, follow_symlinks=follow_symlinks)
    242     copymode(src, dst, follow_symlinks=follow_symlinks)
    243     return dst

~\AppData\Local\Continuum\anaconda3\lib\shutil.py in copyfile(src, dst, follow_symlinks)
    120         with open(src, 'rb') as fsrc:
    121             with open(dst, 'wb') as fdst:
--> 122                 copyfileobj(fsrc, fdst)
    123     return dst
    124 

~\AppData\Local\Continuum\anaconda3\lib\shutil.py in copyfileobj(fsrc, fdst, length)
     77     """copy data from file-like object fsrc to file-like object fdst"""
     78     while 1:
---> 79         buf = fsrc.read(length)
     80         if not buf:
     81             break

OSError: [Errno 22] Invalid argument

Может кто-нибудь помочь отладить? Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Мне удалось скопировать без каких-либо ошибок после попытки: попробуйте / за исключением как PermissionError и OSError. Даже после этих исключений, он почему-то никогда не проходил через «кроме», но успешно копировал все файлы. Я не уверен точно, почему и как, но это прошло успешно. Спасибо за вашу помощь!

0 голосов
/ 30 сентября 2019

Похоже, более 9500 записей успешно завершено. Держу пари, что есть проблема с разрешениями для одной из папок или одного из файлов. Откройте powershell, перейдите к этому каталогу каталогов, затем запустите что-то вроде:

gci | ForEach-Object -Process {Get-Acl -Path $_.FullName}

В представленном примере мы смотрим на верхний уровень каталога и получаем уровни контроля доступа для каждого элемента вкаталог. Добавление параметра -Recurse в gci будет также проходить по всем подкаталогам и подэлементам и может быть тем, что вы ищете. Как только powershell создает список, вы можете фильтровать и исследовать, пока файл проблемы не будет найден.

В качестве альтернативы, вы можете обернуть функцию копирования python в try / catch и записать ошибочное имя файла / каталога в python, затемверните список ошибочных файлов и вернитесь после факта, чтобы вручную редактировать разрешения для этих элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...