脚本文件大小的总和

问题描述:

我想计算各种文件的大小的总和。这是我的脚本:脚本文件大小的总和

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 

但值不存储在变量中。任何人都可以告诉我我做错了什么。我怎样才能修改脚本,以便将值存储在变量中而不是作为输出。

+0

'操作系统。system'将返回'wc'的返回码,而不是输出到'stdout' – 2015-03-13 12:37:06

+0

可能重复[在Python中os.system()的返回值是什么?](http://*.com/questions/ 6466711/os-system-in-python中的什么是返回值) – 2015-03-13 12:38:44

+1

[os.path.getsize](https://docs.python.org/2/library/os.path.html #os.path.getsize)应该完成工作...''os.system'返回值不是创建进程的标准输出。 – 2015-03-13 12:42:13

可以从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 
+0

'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") 
+0

这不会解压缩它们 – haavee 2015-03-13 12:43:23

+0

注意'.gz',实际的文件大小超出了磁盘上文件的物理空间。 – Torxed 2015-03-13 12:44:13

+0

我的不好,我正在用代码编辑,以 – 2015-03-13 12:50:16

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 
+0

'作为fz显示gzip.open(filename)语法错误,不知道为什么。 – user2922822 2015-03-16 07:40:28

+0

在'with'语句末尾应该有一个冒号,即''gzip.open(filename)'为f:' – mhawke 2015-03-16 07:59:52

+0

@ user2922822:我刚刚对读取文件大小的代码做了一个小改动,此代码也将在Python 3中工作(它必须传递要读取的字节数)。 – mhawke 2015-03-16 08:15:33