Преобразование файла с разделителями пробелов в файл значений, разделенных запятыми, в python
Я очень новичок в 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]) )
Когда я запускаю script, я получаю следующее для coordv в самой первой части script, что, конечно, очень неправильно:
, 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 без каких-либо успехов, и до сих пор я не нашел никакого источника информации о том, как я мог это сделать. Каким будет лучший способ получить значения, разделенные запятыми, из этого файла cop? Меня интересует использование модуля csv в python для выбора столбцов 4: 6 и, наконец, использование numpy для их импорта следующим образом:
from numpy import genfromtxt
cocmatrix = genfromtxt('input', delimiter=',')
Я был бы очень рад, если бы кто-нибудь помог мне с этой проблемой.
Ответы
Ответ 1
замените свой первый бит этим.
он не супер симпатичный, но он даст вам формат 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 было все на разных строках, которые вы могли бы добавить
outfile.write("\n")
в конце цикла for, но я не думаю, что ваш код, который следует за этим, будет работать с ним таким образом.
Ответ 2
Вы можете использовать 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())
Ответ 3
Вы можете использовать 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
.
Ответ 4
>>> 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"'
Ответ 5
для преобразования "пробела" в ","
Заполните только имя файла до того, что вы хотите
with open('filename') as infile, open('output', 'w') as outfile:
outfile.write(infile.read().replace(" ", ","))
для преобразования "," в "пробел"
with open('filename') as infile, open('output', 'w') as outfile:
outfile.write(infile.read().replace(",", " "))
Ответ 6
Почему бы не прочитать файл по строкам? Разделите строку в списке, затем верните список с помощью ",".
Ответ 7
Модуль 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)))