2012-01-16 12 views
5

Quiero correr el siguiente comando de bash en Python 3:pitón a la lista o archivo

ls -l 

Sé que puedo hacer lo siguiente:

from subprocess import call 
call(['ls', '-l']) 

¿Cómo puedo guardar este salida a un archivo, o ponerlo en listas o conjuntos?

[-rw-r--r--] [1] [name] [staff] [426] [14 Jan 21:52] [HelloWorld.class] 
[[email protected]] [1] [name] [staff] [107] [14 Jan 21:51] [HelloWorld.java] 
... 
etc. 

Quiero ser capaz de acceder a la información particular, directamente, y luego añadirlo al conjunto, pero no sé cuántos elementos se pueden enumerar.

Cualquier sugerencia, fragmento o ejemplo realmente ayudaría.

+1

Si desea para acceder a la información de archivo/dir, puede que desee comprobar la biblioteca incorporada 'os': [documentation] (http://docs.python.org/py3k/library/os.html). –

Respuesta

8

Una forma de acceder a la información en ls -l salida se puede analizar eso. Por ejemplo, csv.DictReader se puede usar para mapear cada columna a un campo en un diccionario:

import subprocess 
import csv 

process = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) 
stdout, stderr = process.communicate() 

reader = csv.DictReader(stdout.decode('ascii').splitlines(), 
         delimiter=' ', skipinitialspace=True, 
         fieldnames=['permissions', 'links', 
            'owner', 'group', 'size', 
            'date', 'time', 'name']) 

for row in reader: 
    print(row) 

El código anterior imprimir un diccionario para cada línea en ls -l de salida, tales como:

{'group': '<group_name>', 
'name': '<filename>', 
'links': '1', 
'date': '<modified_date>', 
'time': '<modified_time>', 
'owner': '<user_name>', 
'permissions': '-rw-rw-r--', 
'size': '<size>'} 
+0

Obtengo: 'Archivo" ip4.py " , línea 16 imprimir fila ^ SyntaxError: sintaxis no válida' – beoliver

+0

@ user969617 Sí, lo siento, fue para Python 2.x, no para Python 3 como lo solicitó. He actualizado el código para que funcione para python 3. – jcollado

+0

¡esto parece prometedor! Mi siguiente pregunta (por favor, desnudo conmigo, es mi segundo día de Python) es cómo puedo acceder a la información de cada diccionario. ¿Debo darles nombres únicos? Supongamos que quiero cruzar la fecha de referencia con una hoja de cálculo. – beoliver

0
from subprocess import Popen, PIPE 
output = Popen(['ls', '-l'], stdout=PIPE).communicate()[0] 

Puede hacer lo que desee con la salida. Ver python docs para la documentación detallada

+0

Gracias. También había probado este, pero estaba confundido por la falta de formato ...Estoy acostumbrado a hacer cosas con bash & awk, donde la impresión de salida y luego usar 'awk '{print $ n;}'' te permite llegar a las columnas y 'awk NR = $ variable' te permite seleccionar las líneas. ¿Qué sección debería mirar? – beoliver

+0

@Gary señala una buena manera de hacerlo para Python2.7 +. Use eso si puede :) – Wesley

18

Con python2.7 puede utilizar subprocess.check_output:

ls_lines = subprocess.check_output(['ls', '-l']).splitlines() 

Antes de python2.7, es necesario utilizar la API de nivel inferior, que es un poco más complicado.

ls_proc = subprocess.Popen(['ls', '-l'], stdout=subprocess.PIPE) 
ls_proc.wait() 
# check return code 
ls_lines = ls_proc.stdout.readlines() 
1

Lea acerca de Popen. el conjunto que solicitó se obtiene con

import subprocess 
proc = subprocess.Popen(['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
myset=set(proc.stdout) 

o hacer algo como

for x in proc.stdout : print x 

y lo mismo para stderr

puede examinar el estado del proceso con

proc.poll() 

o espere a que termine con

proc.wait() 

también leer

read subprocess stdout line by line

4

Si lo que realmente quiere es enumerar un directorio, en lugar utilizar os.listdir

import os 
files = os.listdir('/path/to/dir') 
for file in files: 
    print(file) 
+0

realmente quiero enumerar las tablas del aeropuerto, pero pensé que usaría un ejemplo simple. La salida real va a ser 'call (['/ System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport', '-s'])' – beoliver

Cuestiones relacionadas