2011-08-10 27 views
0

1234 5678 9876 542 1231; 2333 1234 5678 579pythonを使って次の行に書き込む方法は?

このデータを.txt(murtuz.txt)ファイルからcsv(myfile.csv)ファイルに書き込むと、セミコロンの後に次の行から開始します。

私は以下のコードを試しました.CSSファイルにデータを書き込むのに役立ちますが、セミコロンの後に行を変更できませんでした。

import csv 
from StringIO import StringIO 
import sys 

data = open("murtuz.txt","r").read() 
data1 = StringIO(data) 
print data1   
reader = csv.reader(data1, delimiter=' ',)  
for row in reader: 
    print row 

out = csv.writer(open("myfile.csv","w"), delimiter=',') 
out.writerow(row) 
sys.exit() 

は、専門家の助けが必要です。
ありがとうございます。

+0

が、これはおもちゃの例ですか? 'csv'モジュールなしでこれを行う方が簡単かもしれません。 –

答えて

0

リーダは、ハードコードされたエンド・オブ・ラインとして「\のR」または「の\ n」のいずれかを認識することである、とlineterminatorを無視します。この動作は将来変更される可能性があります。

したがって、セミコロンをラインターミネーターとして扱うように読者に指示することはできません。

あなたが行うことができます。これは、行ごとにセミコロン、任意の数のために動作します

import csv 

data = open("murtuz.txt").readlines() 
outfile = open("myfile.csv","w") 
out = csv.writer(outfile) 
for row in data: 
    row = row.strip().split(';') 
    if row: 
     for subrow in row: 
      subrow = subrow.strip().split() 
      if subrow: 
       out.writerow(subrow) 
outfile.close() 

+0

私はPython 2.5を使っていますが、受け入れられないのです:( – mama

+0

ありがとう、so0ありがとう) しかし、私はその間に空白を残している理由を知りません: – mama

+0

編集したバージョンをお試しください。また、私の答えがあなたを助けたら、それの横のチェックマークをクリックしてそれを受け入れてください。 – agf

0

私は行を解析します。

newrow = str(row) 
if ';' in newrow: 
    fragments = newrow.split(';') 
for each_fragment in fragments: 
    out.writerow(each_fragment) 

これは機能しますか?

+0

いいえ、 'row'は文字列ではありません。 – agf

+0

できませんでした:newrow = str(row) – Jim

+0

いいえ?それは 'str(['a'、 'b'、 'c;'、 'd'、 'e'])を実行してセミコロンで分割するのと同じです。 '' ['a'、 'b'、 'c' '、' '''、 'd'、 'e']' 'はリストを持たないでしょう。 'csvwriter'はそれをどのように解析するのでしょうか? – agf

3

csv.readerは入力として任意の反復可能を受け入れることができます。特に、ジェネレータから生成された線をフィードすることができます。あなたは、入力データをマッサージすることジェネレータを使用することができます - たとえば、セミコロンで分割する:

input csv 
input textwrap 
input io 

def splitter(iterable): 
    for line in iterable: 
     for part in line.split(';'): 
      yield part.strip() 

f=open("murtuz.txt","r") 
# with open("murtuz.txt","r") as f:  # for Python 2.6 or better 
    csvobj=csv.reader(splitter(f),delimiter=' ') 
    for row in csvobj: 
     print(row) 
f.close() 

利回り

['1234', '5678', '9876', '542', '1231'] 
['2333', '1234', '5678', '579'] 
['1234', '5678', '9876', '542', '1231'] 
['2333', '1234', '5678', '579'] 

あなたがコントロール下に読者を持ってたら、それを再度されて書き出します簡単です。 the docsによれば

+0

+1ジェネレータを賢く使うために。 – Evpok

+0

pythonで 'with'を使うことはできません。 – mama

+0

@mama:その場合、 'f = open(...) 'を使います。 – unutbu

0

試してみてください。

full_file_txt = open("murtz.txt").read() #this is ugly and brute force 
rows = full_file_txt.split(";") #split txt file into rows delim by ; 
for row in rows: 
    print ",".join(row.split()) #split each row on space, and output as csv 
+0

@untubuの答えを使う - はるかに綺麗で、ジェネレータを使ってtxtファイルを読み込むのを避けます。 –

関連する問題