在jupyter笔记本中我可以运行以下命令并获取一个文件对象列表,然后我可以打开它:
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)
我尝试了以下内容:
path = f"{PATH}"
files = subprocess.call(['ls', path])
files = subprocess.run(['ls', path], stdout=subprocess.PIPE).stdout.decode('utf-8')
files = os.system(path)
但我只能得到一个字符串对象而不是文件对象,然后我可以打开它并从中获取数据。
答案 0 :(得分:2)
文件名是字符串。这是您传递给open
以获取文件对象的内容,然后您可以从中获取数据。例如,假设您有一个名为spam.py
的脚本:
filename = 'spam.py'
with open(filename) as fileobj:
data = fileobj.read()
print(data)
当你运行它时,它会打印出来。
现在,您在subprocess.run
上调用ls
并读取其stdout
时返回的输出不是每个文件的字符串,而是一个大字符串。
这里简单的答案就是不要呼唤ls
。 Python已经可以为您获取文件名列表:
filenames = os.listdir(path)
for filename in filenames:
with open(filename) as fileobj:
# do stuff with fileobj
但如果你真的必须,你可以使用例如splitlines
方法将你拥有的输出变成一个行列表,这与listdir
返回的内容非常相似,只是以更复杂的方式检索。