2013-11-03 56 views
8

我對Python很陌生。我知道這已經被問到了,並且我很抱歉,但是這種新情況的不同之處在於字符串之間的空格不相等。我有一個文件,命名爲座標,包含以下空格分隔字符串:將空格分隔的文件轉換爲Python中的逗號分隔值文件

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文件中獲取逗號分隔值的最佳方法是什麼?我感興趣的是使用再csv模塊Python中選擇列4:6,最後使用numpy的導入它們如下:

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

,我會很高興,如果有人可以幫助我問題。

+1

'的sed -r 's/^ \ s + //; S/\ s + /,/ G' coord' –

+1

如果唯一的目的僅僅是從一種類型轉換爲另一種類型,bash腳本將很容易,對嗎? – Ananta

+0

我知道如何使用sed,awk,bash腳本等。但是,我的目的不僅僅是從一個類型文件轉換爲另一個類型文件。我正在處理來自量子化學程序的輸出文件以執行一些操作,以便基於考慮局部化分子軌道的電荷中心自動計算大量計算。 – muammar

回答

3

用這個替換你的第一個位。 它不是超級漂亮,但它會給你一個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中有不同的行一切你可以在的結束for循環添加 outfile.write("\n"),但我不認爲你的代碼符合此將與它的工作這樣。

+2

您是否真的測試過該代碼?輸入文件具有多個空間的序列,這些空間轉換爲空字段序列,即'['','','','1','','C','','','','', '','','6.00','','','','0.000000000','','','','1.342650315','','','','0.000000000']'第一行。 -1,因爲它不起作用。 –

+0

哦對不起,以上編輯 – j011y

+0

它仍然不起作用。它產生了一條巨大的線。 –

11

您可以使用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()) 
+1

請注意,'.strip()'在這裏是多餘的; 'line.split()'已經做到了。 – DSM

+0

@DSM:是的,編輯,謝謝! –

+0

@thewolf爲每一行打印出一個額外的空行(否則很好)......任何想法爲什麼會發生這種情況? – bordeo

5

您可以使用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) 

大熊貓是一種用於管理大量的數據,作爲獎金它numpy的行之有效一個偉大的圖書館。使用csv模塊的速度也會非常快。

0

爲什麼不逐行讀取文件?將行分割成列表,然後用','重新加入列表。

+1

向我們展示一些代碼。此外,[狼]已經[建議](http://stackoverflow.com/a/19759560/12892)(http://stackoverflow.com/users/455276/the-wolf)。 –

+0

http://stackoverflow.com/a/19759768/1667218 – user1667218

+0

你爲什麼不編輯你的答案? –

1
>>> a = 'cah 1 C  6.00 0.000000000 1.342650315 0.000000000' 
=> a = 'cah 1 C  6.00 0.000000000 1.342650315 0.000000000' 

>>> a.split() 
=> ['cah', '1', 'C', '6.00', '0.000000000', '1.342650315', '0.000000000'] 

>>> ','.join(a.split()) 
=> 'cah,1,C,6.00,0.000000000,1.342650315,0.000000000' 

>>> ['"' + x + '"' for x in a.split()] 
=> ['"cah"', '"1"', '"C"', '"6.00"', '"0.000000000"', '"1.342650315"', '"0.000000000"'] 

>>> ','.join(['"' + x + '"' for x in a.split()] 
=> '"cah","1","C","6.00","0.000000000","1.342650315","0.000000000"' 
+0

這工作。謝謝。 – Mitendra

0

csv模塊是好,還是這裏的一個辦法做到這一點沒有:

#!/usr/local/cpython-3.3/bin/python 

with open('input-file.csv', 'r') as infile, open('output.csv', 'w') as outfile: 
    for line in infile: 
     fields = line.split() 
     outfile.write('{}\n'.format(','.join(fields)))