in jupyter notebook I can run the following command and get a list of file objects that I can then open:
PATH = someuser/data
files = get_ipython().getoutput('ls {PATH}') #%ls {PATH} in notebook
#then I can run
text = get_ipython().getoutput('less {PATH}{files[0]}')
print(text)
I have tried the following:
path = f"{PATH}"
files = subprocess.call(['ls', path])
files = subprocess.run(['ls', path], stdout=subprocess.PIPE).stdout.decode('utf-8')
files = os.system(path)
But I can only get a string object not file objects that I can then open and get data from.
Advertisement
Answer
Filenames are strings. That’s what you pass to open to get a file object, which you can then get data from. For example, let’s say you have a script called spam.py:
filename = 'spam.py'
with open(filename) as fileobj:
data = fileobj.read()
print(data)
When you run it, it prints itself out.
Now, the output you got back from calling subprocess.run on ls and reading its stdout is not a string for each file, but one big string.
The simple answer here is to just not call out to ls. Python can already get a list of filenames for you:
filenames = os.listdir(path)
for filename in filenames:
with open(filename) as fileobj:
# do stuff with fileobj
But if you really must, you can use, e.g., the splitlines method to turn the output you have into a list of lines, which will be much the same as what listdir returns, just retrieved in a more convoluted way.