0

Python 2.4私の例では、2列のcsvファイルがあります

例えば:

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

csv FILEの各行のPATHにあるオブジェクトのファイルサイズを取得し、その値を新しい列のcsvFILEに追加したいと思います。それを作る:

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

私はいくつかの方法を試しましたが、havntは多くの成功を収めました。

以下のコードは、PATHでfileSizeCmd(du -b)を実行し、filezieを正しく出力しますが、データを使用して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()
4

3 に答える 3

1

エラー処理なしのスケッチ:

#!/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
# ...
于 2012-04-13T20:52:12.533 に答える
0

あなたはできる

1) cvs の内容を (server, filename) のタプルのリストに読み込みます

2) このリストの各要素のファイル サイズを収集する

3) 結果を別のタプル (サーバー、ファイル名、ファイルサイズ) に別のリスト ('結果') にパッケージ化します。

4) 結果を新しいファイルに書き出す

于 2012-04-13T20:48:20.957 に答える
0

まず、ファイル サイズの取得は、使用するよりもはるかに簡単ですsubprocess( os.statを参照)。

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

次に、オブジェクトが別のファイルに書き込むという正しい軌道に乗っていますが、 から取得したリストにwriter列を追加して、 にフィードする必要があるだけです(こちらを参照)。このようなもの:rowreaderwriterowwriter

>>> 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()
于 2012-04-13T20:50:19.980 に答える