OK、コードに問題がたくさんあります:
- あなたのインデントはすべて間違っています。これは python の基本概念の 1 つです。私が言っていることが理解できない場合は、ウェブを検索して少し読んでください。
- 「test2.txt」を開く部分は、spamreaderのループ内にあります。つまり、「test.csv」の行ごとに再度開かれ、切り捨てられます。
- 次の行でファイルを自分自身に書き込もうとしています: writer.writerows(f) (覚えていますか? f は書き込み先のファイルです...)
- csv.writer を使用して行をtxtファイルに書き込みます。
- 各項目の間にスペースが必要ですが、コードのどこでもそれを行っていません
これらすべての問題を要約すると、ここに修正された例があります。これは実際にはコードからそれほど離れていません。
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, ' ', ... ] が出力されます。あなたはそれを一緒に結合し、それだけです。