-2

コンマ区切りのファイルがあります。線はこんな感じ…

1,2,3,4,5
6,7,8
9,10
11,12,13,14,15

すべての行で正確に 5 列が必要です。したがって、新しいファイルは...

1,2,3,4,5
6,7,8,,
9,10,,,
11,12,13,14,15

つまり、1 行にコンマが 4 つ未満の場合です。末尾に必要な数を追加します。まったく同じことを行うpythonモジュールがあると言われました。そのようなモジュールはどこにありますか? そのようなタイプのタスクには awk の方が適していますか?

4

5 に答える 5

2

awkを使用してもかまわない場合は、簡単です。

$ cat data.txt 
1,2,3,4,5
6,7,8
9,10
11,12,13,14,15

$ awk -F, 'BEGIN {OFS=","} {print $1,$2,$3,$4,$5}' data.txt 
1,2,3,4,5
6,7,8,,
9,10,,,
11,12,13,14,15
于 2012-09-20T16:59:18.183 に答える
2

探しているモジュールはcsvmodule です。リストが最小限の長さの要件を満たしていることを確認する必要があります。

with open('output.csv', 'wb') as output:
    input = csv.reader(open('faultyfile.csv', 'rb'))
    output = csv.writer(output, dialect=input.dialect)
    for line in input:
        if len(line) < 5:
            line.extend([''] * (5 - len(line)))
        output.writerow(line)
于 2012-09-20T15:24:52.227 に答える
1
def correct_file(fname):
    with open(fname) as f:
         data = [ line[:-1]+(4-line.count(','))*',' + '\n' for line in f ]
    with open(fname,'w'):
         f.writelines(data)

コメントに記載されているように、これは本当に必要がないときにファイル全体をメモリに読み込みます。すべてを一度に行うのではなく、次のようにします。

import shutil
def correct_file(fname):
    with open(fname,'r') as fin, open('temp','w') as fout:
        for line in fin:
           new = line[:-1]+(4-line.count(','))*',' + '\n'
           fout.write(new)
    shutil.move('temp',fname)

これにより、現在のディレクトリで名前が付けられたファイルがtemp消えます。もちろん、いつでもtempfileモジュールを使用してそれを回避できます...


そして、もう少し冗長ですが、防弾 (?) バージョンの場合:

import shutil
import tempfile
import atexit
import os

def try_delete(fname):
    try:
       os.unlink(fname)
    except OSError:
       if os.path.exists(fname):
          print "Couldn't delete existing file",fname

def correct_file(fname):
    with open(fname,'r') as fin, tempfile.NamedTemporaryFile('w',delete=False) as fout:
        atexit.register(lambda f=fout.name: try_delete(f)) #Need a closure here ...
        for line in fin:
           new = line[:-1]+(4-line.count(','))*',' + '\n'
           fout.write(new)
    shutil.move(fout.name,fname) #This should get rid of the temporary file ...
于 2012-09-20T15:25:49.297 に答える
1
with open('somefile.txt') as f:
      rows = []
      for line in f:
          rows.append(line.split(","))

max_cols = len(max(rows,key=len))
for row in rows:
    row.extend(['']*(max_cols-len(row))

print "\n".join(str(r) for r in rows)

常に n 個のアイテム (この場合は 5) の長さであることが確実であり、ファイルを開く前に常にそれを知っている場合... (このようなことを行うと) メモリ効率が向上します。

 with open("f1","r"):
      with open("f2","w"):
          for line in f1:
              f2.write(line+(","*(4-line.count(",")))+"\n")
于 2012-09-20T15:26:19.863 に答える
0

これはうまくいくかもしれません(GNU sed):

 sed ':a;s/,/&/4;t;s/$/,/;ta' file
于 2012-09-20T17:28:11.773 に答える