0

次のような csv ファイルがあります。

123456,456789,12345,123.45,123456 
123456,456789,12345,123.45,123456
123456,456789,12345,123.45,123456

私は Python プログラミングに非常に慣れていませんが、Python が非常に役立つことを学び、発見しています。基本的に、出力は次のようになります。

123456    456789    12345    123.45    123456
123456    456789    12345    123.45    123456
123456    456789    12345    123.45    123456

基本的に、すべてのフィールドは固定長で右寄せされます。csv ファイルには見出しがありません。

私がこれまでに試したコードは次のとおりです。私が言ったように、私はPythonを初めて使用します。

import csv
 with open('test.csv') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',')
for row in spamreader:
    print(', '.join(row))
    with open('test2.txt', 'wb') as f:
writer = csv.writer(f)
writer.writerows(f)

どんな助けでも大歓迎です: 事前にありがとう.

4

2 に答える 2

0

OK、コードに問題がたくさんあります:

  1. あなたのインデントはすべて間違っています。これは python の基本概念の 1 つです。私が言っていることが理解できない場合は、ウェブを検索して少し読んでください。
  2. 「test2.txt」を開く部分は、spamreaderのループ内にあります。つまり、「test.csv」の行ごとに再度開かれ、切り捨てられます。
  3. 次の行でファイルを自分自身に書き込もうとしています: writer.writerows(f) (覚えていますか? f は書き込み先のファイルです...)
  4. csv.writer を使用して行をtxtファイルに書き込みます。
  5. 各項目の間にスペースが必要ですが、コードのどこでもそれを行っていません

これらすべての問題を要約すると、ここに修正された例があります。これは実際にはコードからそれほど離れていません。

import csv

res = []
# start a loop to collect the data
with open('test.csv') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')
    for row in spamreader:
        line = '\t'.join(row) + '\r\n' # the \n is for linebreaks. \r is so notepad loves you too
        res.append(line)

# now, outside the loop, we can do this:
with open('test2.txt', 'wb') as f:
    f.writelines(res)

編集

間隔を制御したい場合は、次のように ljust 関数を使用できます。

        line = ''.ljust(2).join(row) 

これにより、各項目の間に 2 つのスペースが確保されます。space がデフォルトですが、ljust が使用するものを指定したい場合は、それに 2 番目のパラメーターを追加できます。

        line = ''.ljust(5, '-').join(row) 

次に、各行は次のようになります。

123456-----456789-----12345-----123.45-----123456 

そして、コメントで言及してくれた Philippe T. に感謝します。

2回目の編集

列ごとに異なる長さが必要な場合は、事前に定義する必要があります。最良の方法は、csv ファイルの列と同じ長さのリストを作成することです。各項目はその列の長さであり、最後の項目は行末になります (''.join は実行しないため便利です)。それ自体)、行で圧縮します。最初の列にタブが必要で、他の各列の間に 2 つのスペースが必要だとします。次に、コードは次のようになります。

spacing = ['\t', '  ', '  ', '  ', '\r\n']
# ... the same code from before ...
        line = ''.join([j for i in zip(row, spacing) for j in i])
# ... rest of the code ...

リスト内包表記のループは少し複雑ですが、次のように考えてください。

for i in zip(row, spacing): # the zip here equals ==> [(item1, '\t'), (item2, '  ') ...]
    for j in i: # now i == (item1, '\t')
       j # so j is just the items of each tuple

リスト内包表記を使用すると、[item1, '\t', item2, ' ', ... ] が出力されます。あなたはそれを一緒に結合し、それだけです。

于 2013-09-05T12:51:14.307 に答える