脚本文件大小的总和
我想计算各种文件的大小的总和。这是我的脚本:脚本文件大小的总和
import os
date = raw_input('Enter date in format YYYYMMDD ')
file1 = 'p_poupe_' + date + '.tar.gz.done'
file2 = 'p_poupw_' + date + '.tar.gz.done'
file3 = 'p_pojk_' + date + '.tar.gz.done'
a1 = os.system('zcat ' + file1 + '|wc --bytes')
a2 = os.system('zcat ' + file2 + '|wc --bytes')
a3 = os.system('zcat ' + file3 + '|wc --bytes')
print a1,a2,a3
sum = a1 + a2 + a3
print sum
但值不存储在变量中。任何人都可以告诉我我做错了什么。我怎样才能修改脚本,以便将值存储在变量中而不是作为输出。
可以从commands
捕获使用getoutput
功能的命令的输出为:
import commands as cm
.
.
.
a1 = cm.getoutput('zcat ' + file1 + '|wc --bytes')
a2 = cm.getoutput('zcat ' + file2 + '|wc --bytes')
a3 = cm.getoutput('zcat ' + file3 + '|wc --bytes')
# Note that the outputs are in string format so you need to convert them to integers or floats
a1, a2, a3 = float(a1), float(a2), float(a3)
print a1,a2,a3
sum = a1 + a2 + a3
print sum
'a1,a2,a3 = map(float,(a1,a2,a3))' – horns 2015-03-13 13:05:15
在Unix上,返回值是 为等待指定的格式()编码的过程的退出状态。请注意,POSIX没有指定C系统()函数返回值的 含义,因此Python函数的返回值 取决于系统。
在Windows中,是,运行命令后返回由系统外壳 返回值,由Windows环境变量 COMSPEC给出:上command.com系统(视窗95,98和ME)这始终是 0;在cmd.exe系统上(Windows NT,2000和XP)这是退出 命令运行状态;在使用非本机外壳的系统上,请参阅您的外壳文档。
https://docs.python.org/2/library/os.html#os.system
的问题是,你使用退出代码,而不是标准输出数据作为你的“价值”。 您可能正在寻找使用subprocess.Popen
的例子。或者只是简单地通过打开文件手动编码解决方案。
尝试使用https://docs.python.org/3/library/gzip.html
import gzip
def get_fcont_len(fname):
with gzip.open(fname) as f:
return len(f.read())
total = 0
date = raw_input('Enter date in format YYYYMMDD ')
total += get_fcont_len('p_poupe_' + date + '.tar.gz.done')
total += get_fcont_len('p_poupw_' + date + '.tar.gz.done')
total += get_fcont_len('p_pojk_' + date + '.tar.gz.done')
print(total)
可以使用os模块来获取文件的大小。试试这个:
import os
import tarfile
tar = tarfile.open("yourFile.tar.gz")
tar.extractall("folderWithExtractedFiles")
print os.path.getsize("folderWithExtractedFiles/yourFileInsideTarGz")
os.system
返回命令的退出状态而不是命令的输出。要捕获命令的输出,您应该查看subprocess
module。
subprocess.check_output("zcat " + file1 + " | wc --bytes", shell=True)
# Output the size in bytes of file1 with a trailing new line character
但是它可能是最好使用其他Python模块/方法来做到这一点其他的建议,因为它是最好做的事情直接在Python。
未压缩的文件的大小被存储在最后4个字节gzip文件的。该函数将返回未压缩文件的大小,即“gunzip解压”尺寸:
import os
import gzip
import struct
def get_gunzipped_size(filename):
with gzip.open(filename) as f:
_ = f.read(1) # elicit IOError if file is not a gzip file
f.fileobj.seek(-4, os.SEEK_END)
return struct.unpack('<i', f.fileobj.read(4))[0]
上的大文件,这是比读取所有未压缩的数据,并计算它的长度,因为整个文件不需要快得多被解压缩。
配件到这个代码:
import os
date = raw_input('Enter date in format YYYYMMDD ')
prefixes = ('p_poupe_', 'p_poupw_', 'p_pojk_')
files = ['{}{}.tar.gz.done'.format(prefix, date) for prefix in prefixes]
total_uncompressed = sum(get_gunzipped_size(f) for f in files)
print total_uncompressed
'作为fz显示gzip.open(filename)语法错误,不知道为什么。 – user2922822 2015-03-16 07:40:28
在'with'语句末尾应该有一个冒号,即''gzip.open(filename)'为f:' – mhawke 2015-03-16 07:59:52
@ user2922822:我刚刚对读取文件大小的代码做了一个小改动,此代码也将在Python 3中工作(它必须传递要读取的字节数)。 – mhawke 2015-03-16 08:15:33
'操作系统。system'将返回'wc'的返回码,而不是输出到'stdout' – 2015-03-13 12:37:06
可能重复[在Python中os.system()的返回值是什么?](http://*.com/questions/ 6466711/os-system-in-python中的什么是返回值) – 2015-03-13 12:38:44
[os.path.getsize](https://docs.python.org/2/library/os.path.html #os.path.getsize)应该完成工作...''os.system'返回值不是创建进程的标准输出。 – 2015-03-13 12:42:13