Python 3.x ls-l|awk某物的打印输出
我想在python脚本中获得命令的输出。该命令非常简单-Python 3.x ls-l|awk某物的打印输出,python-3.x,subprocess,Python 3.x,Subprocess,我想在python脚本中获得命令的输出。该命令非常简单-ls-l$filename | awk'{print$5}',基本上捕获文件的大小 我尝试了几种方法,但不知何故无法正确地传递变量文件名 这两种方法我都有什么错 谢谢你的帮助 尝试了以下两种不同的方法: 方法1 在这里,ls抱怨文件名不存在,我完全理解这一点,但我不确定如何将文件名作为变量传递 方法2 这里什么也没印出来 实际结果是文件的大小。内置Python模块os可以为您提供特定文件的大小 以下是与以下方法相关的文档 以下是使用Py
ls-l$filename | awk'{print$5}'
,基本上捕获文件的大小
我尝试了几种方法,但不知何故无法正确地传递变量文件名
这两种方法我都有什么错
谢谢你的帮助
尝试了以下两种不同的方法:
方法1
在这里,ls
抱怨文件名不存在,我完全理解这一点,但我不确定如何将文件名作为变量传递
方法2
这里什么也没印出来
实际结果是文件的大小。内置Python模块
os
可以为您提供特定文件的大小
以下是与以下方法相关的文档
以下是使用Python模块os
获取文件大小的两种方法:
import os
# Use os.stat with st_size
filesize_01 = os.stat('filename.txt').st_size
print (filesize_01)
# outputs
30443963
# os.path.getsize(path) Return the size, in bytes, of path.
filesize_02 = os.path.getsize('filename.txt')
print (filesize_02)
# outputs
30443963
我添加了这个子流程
示例,因为在这个问题上有关于使用os
的对话。我决定在ls
命令上使用stat
命令。我还使用了subprocess.check_output
,而不是您的问题中使用的subprocess.Popen
。下面的示例可以添加到具有错误处理的try块中
我个人的偏好是操作系统
模块,但你的偏好可能是子流程
模块
希望这三种方法中的一种能帮助你解决问题 你看过内置的Python模块操作系统吗?使用
ls
,即使在bash中,这也是不好的做法,更不用说在Python中了;请参见和。也就是说,您的awk
中的^default
有什么用?您只打印名称以default
开头的文件的大小,而忽略任何其他文件名。为什么不干脆second=['awk','{print$5}']
与您的“第一个”comand对等?(需要明确的是,在任何情况下都不应该在生产代码中实际使用这种方法,但修复它可能有助于证明问题出在awk代码上,而不是在Python中如何使用它)。@lifeicomplex,我曾经使用过操作系统。但后来我看到一篇文章,说操作系统不应该再使用了,据说子流程更好。@CharlesDuffy,这里的python新手,并没有意识到默认值必须是某种东西。我会查的。最后一行的第三行应该是“02”,而不是“01”,但是编辑不会接受更正,除非我对其他5个字符也做了不必要的更改。@RayButterworth谢谢。剪切和粘贴杀死了我们中最好的人。最初我在阅读“使用os
替代”建议,建议使用os.popen()
或类似的方法,但实际上你所建议的是更好的做法。@charlesduff谢谢。这些方法似乎比子流程的方法更干净、更安全。@droidian,使用os.system()
或os.popen()
或os
的任何其他部分做与子流程
相同的事情是不行的。但是这里告诉您要使用的操作系统
部分与子流程
完全不同。
first = ['ls', '-l', filename]
second = ['awk', ' /^default/ {print $5}']
p1 = subprocess.Popen(first, stdout=subprocess.PIPE)
p2 = subprocess.Popen(second, stdin=p1.stdout, stdout=subprocess.PIPE)
out = p2.stdout.read()
print out
import os
# Use os.stat with st_size
filesize_01 = os.stat('filename.txt').st_size
print (filesize_01)
# outputs
30443963
# os.path.getsize(path) Return the size, in bytes, of path.
filesize_02 = os.path.getsize('filename.txt')
print (filesize_02)
# outputs
30443963
from subprocess import check_output
def get_file_size(filename):
# stat command
# -f display information using the specified format
# the %z format selects the size in bytes
output = check_output(['stat', '-f', '%z', str({}).format(filename)])
# I also use the f-string in this print statement.
# ref: https://realpython.com/python-f-strings/
print(f"Filesize of {filename} is: {output.decode('ASCII')}")
# outputs
30443963
get_file_size('filename.txt')