2012-04-13 82 views
0

的Python 2.4 對於我的例子,我有一個2列csv文件獲得文件大小和附加到CSV的新列文件

如:

HOST, FILE 
server1, /path/to/file1 
server2, /path/to/file2 
server3, /path/to/file3 

我想獲得的文件大小對象在csv FILE中的每一行,然後將該值添加到新列上的csv FILE。 製作:

HOST, PATH, FILESIZE 
server1, /path/to/file1, 6546542 
server2, /path/to/file2, 46546343 
server3, /path/to/file3, 87523 

我試了幾種方法,但havnt有很多成功。

下面的代碼在PATH執行fileSizeCmd(DU-B)並正確輸出filezie,但我havnt想出如何利用這些數據來添加到CSV文件

import datetime 
import csv 
import os, time 
from subprocess import Popen, PIPE, STDOUT 

now = datetime.datetime.now() 
fileSizeCmd = "du -b" 
SP = " " 

# Try to get disk size and append to another row after entry above 
#st = os.stat(row[3]) 
#except IOError: 
#print "failed to get information about", file 
#else: 
#print "file size:", st[ST_SIZE] 
#print "file modified:", time.asctime(time.localtime(st[ST_MTIME])) 

incsv = open('my_list.csv', 'rb') 
try: 
    reader = csv.reader(incsv) 
    outcsv = open('results/results_' + now.strftime("%m-%d-%Y") + '.csv', 'wb') 
    try: 
     writer = csv.writer(outcsv) 

     for row in reader: 
     p = Popen(fileSizeCmd + SP + row[1], shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
     stdout, empty = p.communicate() 


     print 'Command: %s\nOutput: %s\n' % (fileSizeCmd + SP + row[1], stdout) 

     # Results in bytes example 
     # 
     # Output: 
     # 8589935104  /path/to/file 
     # 

    # Write 8589935104 to new column of csv FILE 

    finally: 
     outcsv.close() 

finally: 
incsv.close() 

回答

1

素描W/O錯誤處理:

#!/usr/bin/env python 

import csv 
import os 

filename = "sample.csv" 
# localhost, 01.html.bak 
# localhost, 01.htmlbak 
# ... 

def filesize(filename): 
    # no need to shell out for filesize 
    return os.stat(filename).st_size 

with open(filename, 'rb') as handle: 
    reader = csv.reader(handle) 
    # result is written to sample.csv.updated.csv 
    writer = csv.writer(open('%s.updated.csv' % filename, 'w')) 
    for row in reader: 
     # need to strip filename, just in case 
     writer.writerow(row + [ filesize(row[1].strip()) ]) 

# result 
# localhost, 01.html.bak,10021 
# localhost, 01.htmlbak,218982 
# ... 
+0

尼斯代碼@miku – 2012-04-13 22:29:58

+0

我似乎無法得到這與2.4工作。我想我已經改變了你的發言權,但我仍然沒有太多的運氣 – Tommy 2012-04-13 23:41:04

+0

@miku我得到了這個工作。謝謝。如果文件不存在,它確實失敗,但是 – Tommy 2012-04-14 00:49:24

0

您可以

1)讀出的內容的CVS到(服務器,文件名)

2)的元組的列表收集的文件大小此列表

3)包的每一個元素結果到另一元組(服務器,文件名,文件大小)到另一個列表(「結果」)

4)寫出來的結果,以新的文件

0

首先,獲取文件大小比使用subprocess容易得多(見os.stat):

>>> os.stat('/tmp/file').st_size 
100 

其次,你在正確的軌道上你writer對象寫入到不同的文件,但你只需要添加一列到row列出你從reader找回然後將它們送到的(見here)。事情是這樣的:

>>> writerfp = open('out.csv', 'w') 
>>> writer = csv.writer(writerfp) 
>>> for row in csv.reader(open('in.csv', 'r')): 
...  row.append('column') 
...  writer.writerow(row) 
... 
>>> writerfp.close()