2012-01-14 20 views
4

私は表形式のデータを含むテキストファイルを持っています。私がする必要があるのは、スペース区切りの代わりにカンマ区切りの新しいテキストファイルに書き込む作業を自動化し、既存のデータからいくつかの列を抽出し、列の順序を変更することです。スペース区切りのファイルをCSVに変換する

これは、元のデータの最初の4行の抜粋である:ここで

 
Number of rows: 8542 
Algorithm |Date |Time |Longitude |Latitude |Country  
1 2000-01-03 215926.688 -0.262 35.813 Algeria 
1 2000-01-03 215926.828 -0.284 35.817 Algeria 

は、私が最終的に何をしたいです:これにアプローチする方法について

 
Longitude,Latitude,Country,Date,Time 
-0.262,35.813,Algeria,2000-01-03,215926.688 

任意のヒント?

+0

スニペットをどのように提示したかに問題がありました。私はそれがあなたが意図したものだと信じています。 –

+0

はい、これは私が意図したものです、ありがとう! – MLau

+0

は輸入注文です – RanRag

答えて

6

ファイルはスペースではなくタブで区切られていると思います。どんなバグは練習として、あなたのために残され、このコードはテストされ

input_file = open('some_tab_separated_file.txt', 'r') 
output_file = open('some_tab_separated_file.csv', 'w') 
input_file.readline() # skip first line 
for line in input_file: 
    (a, date, time, lon, lat, country) = line.strip().split('\t') 
    output_file.write(','.join([lon, lat, country, date, time]) + '\n') 
input_file.close() 
output_file.close() 

もしそうなら、あなたのような何かを試すことができます。

+0

こんにちは、これは、フィールドのヘッダー名を並べ替えるように見えます。列内のデータを並べ替えるか、別のステップがありますか? – MLau

+0

は、タブ区切りを指定すると、 'for line in file'ループの中でヘッダーとデータを並べ替えるべきです。 –

+0

あなたの方法にはまだ取り組んでいます。これを取得する: "スクリプトの実行に失敗しました - 構文エラー - リテラルに割り当てることはできません"すべてのフィールド名を正しい名前に変更しました。 – MLau

0

str.split()引数を指定しない場合は、任意の長さの空白で分割されます。 operator.itemgetter()は複数の引数を取り、タプルを返します。

4

csvモジュールと' 'の区切り文字を持つリーダーを使用してデータを読み込み、同じモジュールのライター(コンマ区切り文字付き)を使用して出力を生成することができます。

実際、the first example in the csv module documentationdelimiter=' 'を使用します。

あなたはDictReader/DictWriterを使用して、コンストラクタ内の列の順序を指定することができます(fieldnamesリスト:あなたは再オーダーしたい場合は、リーダ/ライタに異なる)を出力するためのエントリあなたが望むためです。

(あなたが出力を生成するとき、あなたの最初の2行を無視/スキップする必要があるかもしれません。)

編集:ここでは

がマルチワード国名に対処するための一例である:

import cStringIO 
import csv 

f = cStringIO.StringIO("""A B C 
1 2 Costa Rica 
3 4 Democratic Republic of the Congo 
""") 

r = csv.DictReader(f, delimiter=' ', restkey='rest') 
for row in r: 
    if row.get('rest'): 
     row['C'] += " %s" % (" ".join(row['rest'])) 
    print 'A: %s, B: %s, C: %s' % (row['A'], row['B'], row['C']) 

restkey=を使用して、残りの内容(ここではrestkey='rest')の値であるdictエントリを連結します。このプリントは:

A: 1, B: 2, C: Costa Rica 
A: 3, B: 4, C: Democratic Republic of the Congo 
+0

'delimiter = '''を使うと "Costa Rica"のような国はどうなるのですか? –

+0

@PauloScardine、あなたはこれに 'restkey'を使うことができます(updateを見てください)。もちろん、最初の例では、これは最初の2行で少しクリーンアップする必要がありますが、プレーン(非 'DictReader')を使用する場合でも、何が残っているかを取得して一緒に結合できるはずです。説明のために – Bruno

+0

ありがとう。 –

0

私は重要なアイデアは、あなたが区切り文字@Paulo Scardineとして「\ tを」を使用しなければならないということですね。

私は、pandasが列データを処理するための非常に優れたライブラリであると付け加えたいと思います。

>>> src = 'path/to/file' 
>>> dest = 'path/to/dest_csv' 
>>> column_names = ['names', 'of', 'columns'] 

>>> df = pd.read_csv(src, delimiter='\t', names=column_names) 

# Do something in pandas if you need to 

>>> df.to_csv(dest, index=False, sep = ';') 
関連する問題