2012-01-14 3 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

является заказ import – 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 documentation использует delimiter=' '.

Вы можете использовать DictReader/DictWriter и указать порядок столбцов в конструкторе (fieldnames список: различен для чтения/записи, если вы хотите изменить порядок) для вывода записей в порядке, вы хотите.

(Вы, возможно, придется пропустить/игнорировать ваши первые две строки при получении выходного сигнала.)

EDIT:

Вот пример для работы с именами нескольких слов стран:

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= и объедините запись dict для этого значения, которое представляет собой список оставшихся (здесь restkey='rest'). Это печатает:

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

Что происходит с такой страной, как «Коста-Рика», если вы используете 'delimiter = '''? –

+0

@PauloScardine, вы должны иметь возможность использовать 'restkey' для этого (см. Обновление). Конечно, в начальном примере это потребует немного очистки с исходными двумя строками, но даже при использовании простой (не 'DictReader') должно быть возможно получить то, что осталось, и объединить их. – Bruno

+0

спасибо за объяснение. –

0

Я предполагаю, что важная идея состоит в том, что вы должны использовать «\ г» в качестве разделителя @Paulo Scardine.

Я просто хотел добавить, что панды - очень хорошая библиотека для обработки данных столбцов.

>>> 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 = ';') 
Смежные вопросы