Skip to content

Python Split Using Space vs None Separator

Quick reminder of how to split a "ls -l" listing. It is problematic because the last field which is the directory or file name can have spaces itself, so splitting on spaces which is the only option here still need a bit of additional work.

import config
import subprocess

## First experiment doing manual manipulation of the fields.  
## Basically split on all spaces and then assemble the file name.
def dir_listing():
  ls_lines = subprocess.check_output(['ls', '-l']).splitlines()
  ls_arr= []
  for item in ls_lines:
    if not "total" in item:
      f = item.split()
      ## fname = item.join(str(v) for v in item.index if v > 7)
      fname = ""
      for idx,val in enumerate(f):
        if idx > 7:
          fname = fname + str(val) + " "
      fname = fname[:-1]
      ls_fields = [f[0],f[1],f[2],f[3],f[4],f[5]+"-"+f[6]+"-"+f[7],fname]
      ls_arr.append(ls_fields)
  return ls_arr

## Second attempt is split on spaces with a max split defined. 
## This sounds like the obvious way to do this but I needed to use "None" and not " "
## as shown below.
def dir_listing_optimized():
  ls_lines = subprocess.check_output(['ls', '-l']).splitlines()
  ls_arr= []
  for item in ls_lines:
    if not "total" in item:
      ## None will use arbitrary strings of whitespace characters (space, tab, newline, return, formfeed)
      ## When using split(" ",8) I had more separation than I expected and therefor my last field 
      ## was not working right.
      f = item.split(None,8)
      ls_arr.append(f)
  return ls_arr

for dir in dir_listing():
  print dir

for dir in dir_listing_optimized():
  print dir
Published inPython