15

私はPythonが初めてです。これはすでに質問されていることを知っており、申し訳ありませんが、この新しい状況の違いは、文字列間のスペースが等しくないことです。次のスペース区切りの文字列を含むcoordという名前のファイルがあります。

   1  C       6.00    0.000000000    1.342650315    0.000000000
   2  C       6.00    0.000000000   -1.342650315    0.000000000
   3  C       6.00    2.325538562    2.685300630    0.000000000
   4  C       6.00    2.325538562   -2.685300630    0.000000000
   5  C       6.00    4.651077125    1.342650315    0.000000000
   6  C       6.00    4.651077125   -1.342650315    0.000000000
   7  C       6.00   -2.325538562    2.685300630    0.000000000
   8  C       6.00   -2.325538562   -2.685300630    0.000000000
   9  C       6.00   -4.651077125    1.342650315    0.000000000
  10  C       6.00   -4.651077125   -1.342650315    0.000000000
  11  H       1.00    2.325538562    4.733763602    0.000000000
  12  H       1.00    2.325538562   -4.733763602    0.000000000
  13  H       1.00   -2.325538562    4.733763602    0.000000000
  14  H       1.00   -2.325538562   -4.733763602    0.000000000
  15  H       1.00    6.425098097    2.366881801    0.000000000
  16  H       1.00    6.425098097   -2.366881801    0.000000000
  17  H       1.00   -6.425098097    2.366881801    0.000000000
  18  H       1.00   -6.425098097   -2.366881801    0.000000000

最初の列の各文字列の開始前のスペースに注意してください。したがって、csvに変換するために次のことを試しました。

with open('coord') as infile, open('coordv', 'w') as outfile:
    outfile.write(infile.read().replace("  ", ", "))

# Unneeded columns are deleted from the csv

input = open('coordv', 'rb')
output = open('coordcsvout', 'wb')
writer = csv.writer(output)
for row in csv.reader(input):
    if row:
        writer.writerow(row)
input.close()
output.close()

with open("coordcsvout","rb") as source:
    rdr= csv.reader( source )
    with open("coordbarray","wb") as result:
        wtr= csv.writer(result)
        for r in rdr:
            wtr.writerow( (r[5], r[6], r[7]) )

スクリプトを実行すると、スクリプトの最初の部分でcoordvに対して次のようになりますが、これはもちろん非常に間違っています。

,  1, C, , ,  6.00, , 0.000000000, , 1.342650315, , 0.000000000
,  2, C, , ,  6.00, , 0.000000000,  -1.342650315, , 0.000000000
,  3, C, , ,  6.00, , 2.325538562, , 2.685300630, , 0.000000000
,  4, C, , ,  6.00, , 2.325538562,  -2.685300630, , 0.000000000
,  5, C, , ,  6.00, , 4.651077125, , 1.342650315, , 0.000000000
,  6, C, , ,  6.00, , 4.651077125,  -1.342650315, , 0.000000000
,  7, C, , ,  6.00,  -2.325538562, , 2.685300630, , 0.000000000
,  8, C, , ,  6.00,  -2.325538562,  -2.685300630, , 0.000000000
,  9, C, , ,  6.00,  -4.651077125, , 1.342650315, , 0.000000000
, 10, C, , ,  6.00,  -4.651077125,  -1.342650315, , 0.000000000
, 11, H, , ,  1.00, , 2.325538562, , 4.733763602, , 0.000000000
, 12, H, , ,  1.00, , 2.325538562,  -4.733763602, , 0.000000000
, 13, H, , ,  1.00,  -2.325538562, , 4.733763602, , 0.000000000
, 14, H, , ,  1.00,  -2.325538562,  -4.733763602, , 0.000000000
, 15, H, , ,  1.00, , 6.425098097, , 2.366881801, , 0.000000000
, 16, H, , ,  1.00, , 6.425098097,  -2.366881801, , 0.000000000
, 17, H, , ,  1.00,  -6.425098097, , 2.366881801, , 0.000000000
, 18, H, , ,  1.00,  -6.425098097,  -2.366881801, , 0.000000000

.replace でさまざまな可能性を試しましたが、成功しませんでした。これまでのところ、これを行う方法に関する情報源は見つかりませんでした。このcoordファイルからカンマ区切りの値を取得する最良の方法は何ですか? 私が興味を持っているのは、Python で csv モジュールを使用して列 4:6 を選択し、最後に numpy を使用して次のようにインポートすることです。

from numpy import genfromtxt
cocmatrix = genfromtxt('input', delimiter=',')

誰かがこの問題で私を助けてくれたらとてもうれしいです。

4

8 に答える 8

14

csvを使用できます:

import csv

with open(ur_infile) as fin, open(ur_outfile, 'w') as fout:
    o=csv.writer(fout)
    for line in fin:
        o.writerow(line.split())
于 2013-11-03T23:35:03.160 に答える
8

あなたはpython pandasを使うことができます、私はあなたのデータをに書きましたdata.csv

import pandas as pd
>>> df = pd.read_csv('data.csv',sep='\s+',header=None)
>>> df
     0  1  2         3         4  5
0    1  C  6  0.000000  1.342650  0
1    2  C  6  0.000000 -1.342650  0
2    3  C  6  2.325539  2.685301  0
3    4  C  6  2.325539 -2.685301  0
4    5  C  6  4.651077  1.342650  0
5    6  C  6  4.651077 -1.342650  0
...

これの素晴らしいところは、使用できる基になる numpy 配列にアクセスできることdf.valuesです。

>>> type(df.values)
<type 'numpy.ndarray'>

カンマ区切りでデータ フレームを保存するには:

>>> df.to_csv('data_out.csv',header=None)

Pandas は大量のデータを管理するための優れたライブラリであり、おまけに numpy とうまく連携します。csvまた、モジュールを使用するよりもはるかに高速になる可能性が非常に高くなります。

于 2013-11-03T23:41:27.817 に答える
7

最初のビットをこれに置き換えます。とてもきれいではありませんが、csv形式になります。

with open('coord') as infile, open('coordv', 'w') as outfile:
    for line in infile:
        outfile.write(" ".join(line.split()).replace(' ', ','))
        outfile.write(",") # trailing comma shouldn't matter

出力ファイルのすべてを別の行に配置したい場合 outfile.write("\n")は、for ループの最後に追加できますが、これに続くコードがそのように機能するとは思いません。

于 2013-11-03T23:30:02.530 に答える
0

ファイルを 1 行ずつ読み取らないのはなぜですか? 行をリストに分割し、',' でリストを再結合します。

于 2013-11-03T23:51:04.670 に答える