2016-04-06 1 views
0

J'ai un répertoire avec des fichiers qui ont des espaces dans leurs noms, j'ai un script python qui charge ces fichiers et exécute la commande tail -n1 sur eux, mais comme il y a un espace dans le nom , il échoue. par exemple.python gérer les noms de fichiers avec des espaces dans un répertoire

J'ai un dirctory avec le fichier suivant

data from_10_13_2014 09_00_45.json

et mon script contient la ligne suivante line = os.popen("tail -n1 %s" % files).read()

dès maintenant j'obtenir l'erreur suivante

tail: cannot open ‘/home/dataserver/Development/Test/data’ for reading: No such file or directory 
tail: cannot open ‘from_10_13_2014’ for reading: No such file or directory 
tail: cannot open ‘09_00_45.json’ for reading: No such file or directory 

La solution J'ai maintenant est en train de remplacer les espaces blancs avec _ est-il possible de le faire sans renamin g les fichiers?

Répondre

2

Essayez plutôt "tail -n1 %r" à la place, il utilisera la représentation sous forme de chaîne de la chaîne, c'est-à-dire tail -n1 "data from_10_13_2014 09_00_45.json".

Ou mieux encore, passez à l'utilisation du module subprocess. Vous pouvez par exemple utiliser la fonction subprocess.check_output qui échappe à des arguments automatiquement:

tail_line = subprocess.check_output(["tail", "-n1", files]) 

je vous recommande de ne pas utiliser l'espace blanc du tout dans les noms de fichiers, il finit toujours par casser des scripts à la fin. Peut-être que vous pouvez écrire un deuxième script qui normalise vos noms de fichiers?

+1

Merci, malheureusement je ne contrôle pas que les noms de fichiers, ils sont générés par un capteur, nous utilisons et il n'y a aucun moyen de le changer. – cyberbemon

+0

Ah, la vie est dure parfois :) –

0

Remplacez par \ dans files. Donc, un backslash + espace.

0

Le problème est que vous dépendez de popen pour analyser la ligne de commande pour vous, et bien sûr, il utilise des espaces pour effectuer une partie de l'analyse. Une meilleure solution consiste à créer une liste d'arguments individuels afin qu'aucune analyse de ligne de commande ne se produise.

La meilleure façon de le faire est d'utiliser subprocess.check_output:

line = subprocess.check_output(["tail", "-n1", "/tmp/junk.py"])