Python IOError: [Errno 13] le refus d'une Autorisation
Avec le code ci-dessous je reçois IOError: [Errno 13] Permission denied
, et je sais que cela est dû au répertoire de sortie étant un sous-dossier du répertoire d'entrée:
import datetime
import os
inputdir = "C:\\temp2\\CSV\\"
outputdir = "C:\\temp2\\CSV\\output\\"
keyword = "KEYWORD"
for path, dirs, files in os.walk(os.path.abspath(inputdir)):
for f in os.listdir(inputdir):
file_path = os.path.join(inputdir, f)
out_file = os.path.join(outputdir, f)
with open(file_path, "r") as fh, open(out_file, "w") as fo:
for line in fh:
if keyword not in line:
fo.write(line)
Cependant, lorsque je change le dossier de sortie: outputdir = "C:\\temp2\\output\\"
le code s'exécute correctement. Je veux être en mesure d'écrire les fichiers modifiés dans un sous-dossier du répertoire d'entrée. Comment pourrais-je le faire sans obtenir la Permission denied' erreur? Serait la tempfile
module être utile dans ce scénario?
Avez-vous des autorisations d'écrire là-bas? Je voudrais utiliser
pourriez-vous faire de fh en écriture?
Au passage, si vous utilisez des chaînes brutes puis le double-barres obliques inverses ne sera pas nécessaire. Exemple:
Merci pour l'astuce, Li-aung. =)
D'abord, vous devez comprendre comment
tempfile
, personnellement, que c'est plus propre.pourriez-vous faire de fh en écriture?
Au passage, si vous utilisez des chaînes brutes puis le double-barres obliques inverses ne sera pas nécessaire. Exemple:
r"C:\Temp1\CSV\Output\"
vs "C:\\Temp1\CSV\\Output\\"
.Merci pour l'astuce, Li-aung. =)
D'abord, vous devez comprendre comment
walk
œuvres.OriginalL'auteur Keith | 2012-03-28
Vous devez vous connecter pour publier un commentaire.
os.listdir
sera de retour répertoire ainsi que les noms de fichier.output
est dansinputdir
de sorte que lewith
essaye d'ouvrir un répertoire pour la lecture/écriture.Exactement ce que vous essayez de faire?
path, dirs, files
ne sont pas même d'être utilisées dans le récursiveos.walk
.Edit: je pense que vous êtes à la recherche de quelque chose comme ceci:
Cela complique les choses répéter sur un répertoire en le modifiant en même temps. Il peut être fait en modifiant
dirs
et la suppression de répertoire de sortie lorsqu'il est vu, mais c'est plus simple de garder le répertoire de sortie à l'extérieur de l'entrée de répertoire. Vous n'avez pas besoin deos.listdir
.for f in files
avecfile_path = os.path.join(path,f)
va vous donner le chemin complet de chaque fichier, de manière récursive, en vertu de l'entrée dir.Merci pour vos commentaires, Marque. Je vais regarder dans vos suggestions. Je suis d'accord que c'est plus simple de garder la sortie dir à l'extérieur de l'entrée dir, cependant, d'autres personnes de mon équipe qui sera à l'aide de cet outil, que je suis de la création que vous préférez avoir la sortie dir dans l'entrée dir. J'ai déjà accompli ce à l'aide de PowerShell (qui ne semble pas avoir ces complications), mais je veux profiter de Python texte de puissance de traitement. Dans certains cas, je vais avoir des millions de lignes dans les fichiers CSV de processus et veulent un outil plus puissant pour gérer le travail.
J'ai mis à jour ma réponse avec quelque chose qui fonctionne de la manière que vous voulez. Re: PowerShell, n'a que la version recurse? Commentaire de la
# Handle case...
partie ci-dessus et vous verrez comment ça complique les choses.Salut Marc, j'ai testé votre code ci-dessus et il fonctionne très bien! Je vous remercie. Et RE: PowerShell - oui, il le fait de manière récursive. =)
OriginalL'auteur Mark Tolonen
Si vous avez du succès dans l'écriture d'un répertoire de sortie à l'extérieur de l'entrée de la traversée de répertoire, puis de l'écrire il y a d'abord en utilisant le même code que ci-dessus, puis déplacez-le vers un sous-répertoire dans le répertoire d'entrée. Vous pouvez utiliser
os.move
.os.move
mais n'étais pas sûr si cette approche serait moins efficace. J'ai pu l'essayer...Salut Keith, qui n'est pas moins efficace, c'est une bonne approche. En fait, l'écriture d'un endroit à l'extérieur de votre lieu de lecture serait mieux. Et puis vous pouvez automatiquement passer à la destination finale.
Ahh...bon à savoir. Merci pour les commentaires, Senthil. Je vais lui donner un essai.
OriginalL'auteur Senthil Kumaran