Получение ошибки Python --›PermissionError: [WinError 32] Процесс не может получить доступ к файлу, поскольку он используется другим процессом

Я пытаюсь прочитать файл csv по локальному пути с помощью python, а затем обрабатываю записи файла csv в структуру json, наконец, печатая их на консоли. Я написал код в блоке try & exclude. Я ожидаю, что если какое-либо исключение произойдет в блоке try при чтении данных из файла csv, блок исключений должен напечатать это исключение, и он должен переместить файл csv из текущего расположение в папке с именем errored. Но при тестировании путем имитации сценария с ошибкой невозможно переместить csv в папку с ошибкой. Вместо этого выдается ошибка: - PermissionError: [WinError 32] Процесс не может получить доступ к файлу, поскольку он используется другим процессом. Ниже приведен код:-

try:
   global df
   df = pd.read_csv('CBD_BU_FULL.csv', encoding='UTF-8', dtype=str)
   df = df.assign(FILE_TYPE ='BU')
   data = df.to_json(orient = "records", lines=False).split('\n')
   print(data)

except:
   print("An exception occurred")    
   os.rename('CBD_BU_FULL.csv', '/Errored/CBD_BU_FULL.csv')

person SUNDARAM SRIVASTAVA    schedule 10.07.2020    source источник
comment
файл csv открыт в каком-то другом редакторе, пока вы запускаете скрипт python?   -  person mjrezaee    schedule 11.07.2020


Ответы (2)


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

import traceback
import pandas as pd
try:
   with open('CBD_BU_FULL.csv', "r") as f:
       df = pd.read_csv(f, encoding='UTF-8', dtype=str)
   df = df.assign(FILE_TYPE ='BU')
   data = df.to_json(orient = "records", lines=False).split('\n')
   print(data)

except:
   traceback.print_exc(1)
   os.rename('CBD_BU_FULL.csv', '/Errored/CBD_BU_FULL.csv')
person Tadhg McDonald-Jensen    schedule 11.07.2020

Вы не можете использовать os.rename, если файл уже используется. Вместо этого вы можете использовать shutil.copy.

person np8    schedule 10.07.2020
comment
Я также пробовал это: Shutil.move('CBD_BU_FULL.csv', '/Errored/CBD_BU_FULL.csv') и я получаю ту же ошибку - person SUNDARAM SRIVASTAVA; 11.07.2020
comment
Возможно, shutil.move нельзя использовать, когда файл используется. Вы пробовали shutil.copy? - person np8; 11.07.2020
comment
да, Shutil.copy работает ... так что это означает, что мне нужно удалить файл после того, как произойдет копирование файла. Но я предполагаю, что для удаления файл также должен быть закрыт сначала. Как я могу закрыть файл после того, как чтение через panda произошло. @np8 - person SUNDARAM SRIVASTAVA; 11.07.2020
comment
Если файл зарезервирован другим процессом, вы не можете переместить или удалить его. Такая ситуация обычно возникает, если файл открыт в другой программе (например, Excel). Если вы не можете узнать, какой процесс использует ваш файл, просто войдите в систему/перезагрузитесь. В винде можно с помощью ресмона проверить, какой процесс использует файл (поискать ручками). - person np8; 11.07.2020