Выберите столбцы данных из .txt в .csv - PullRequest
3 голосов
/ 07 августа 2010

Я довольно новичок в python (скорее, я использую его только на прошлой неделе). Моя задача кажется довольно простой, но я изо всех сил. У меня есть несколько больших текстовых файлов, каждый из которых содержит множество столбцов данных из разных регионов. Я хотел бы взять данные из одного текстового файла и извлечь только те столбцы данных, которые мне нужны, и записать их в новый файл .csv. В настоящее время они разделены символом табуляции, но я хотел бы, чтобы выходные данные были разделены запятой.

У меня есть:

#YY  MM DD hh mm WVHT  SwH  SwP  WWH  WWP SwD WWD   MWD
#yr  mo dy hr mn    m    m  sec    m  sec  -  degT  degT
2010 07 16 17 00  0.5  0.5  5.0  0.3  4.0 SSE SSE   163
2010 07 16 16 00  0.6  0.5  5.9  0.3  3.8 SSE SSE   165
2010 07 16 15 00  0.5  0.5  6.7  0.3  3.6 SSE  SW   151
2010 07 16 14 00  0.6  0.5  5.6  0.3  3.8 SSE SSE   153

Я хочу оставить только: DD, WVHT и MWD

Спасибо заранее, Harper

Ответы [ 4 ]

2 голосов
/ 07 августа 2010

Вам нужно отформатировать этот вопрос немного более разборчиво. :)

Взгляните на модуль Python CSV для записи ваших CSV-файлов из ваших теперь сохраненных данных: http://docs.python.org/library/csv.html

РЕДАКТИРОВАТЬ: Вот лучший, более краткий код, основанный на комментарии + модуль CSV:

import csv

csv_out = csv.writer(open('out.csv', 'w'), delimiter=',')

f = open('myfile.txt')
for line in f:
  vals = line.split('\t')
  # DD, WVHT, MWD
  csv_out.writerow(vals[2], vals[5], vals[12])
f.close()
0 голосов
/ 07 августа 2010

Вот базовая вещь, поскольку она является базовой потребностью, и поскольку нет широкого использования csv, вот фрагмент без модуля csv.

DD = 2
WVHT = 5
MWD = 12
INPUT = "input.txt"
OUTPUT = "output.csv"

from os import linesep

def main():
    t = []
    fi = open(INPUT)
    fo = open(OUTPUT, "w")
    try:
        for line in fi.xreadlines():
            line = line.split()
            t.append("%s,%s,%s" %(line[DD], line[WVHT], line[MWD]))
        fo.writelines(linesep.join(t))
    finally:
        fi.close()
        fo.close()

if __name__ == "__main__":
    main()
0 голосов
/ 07 августа 2010

Одна из проблем заключается в том, что все ваши данные находятся в одной строке:

2010 07 16 17 00 0,5 0,5 5,0 0,3 4.0 SSE SSE 163 2010 07 16 16 00 0,6 0,5 5,9 0,3 3,8 SSE SSE 165 2010 07 16 15 00 0,5 0,5 6,7 0,3 3,6 SSE SW 151 2010 07 16 14 00 0,6 0,5 5,6 0,3 3,8 SSE SSE 153

Если это так, вам нужно разделить строку ввода. Если вы знаете, что ваши данные являются регулярными, то вы можете быть хитрым и разбитым на 2010 год:

f = open('data.txt')
for line in f:
    for portion in line.split(' 2010') #space is significant
    # write to csv

Если ваши данные охватывают несколько лет, тогда модуль Python itertools может быть очень удобен. Я часто использую рецепт grouper.

import csv
from itertools import izip_longest

csv_writer = csv.writer(open('eggs.csv', 'wb'), delimiter=',')

def grouper(n, iterable, fillvalue=None):
  """
  >>> grouper(3, 'ABCDEFG', 'x')
  ['ABC', 'DEF', 'Gxx']
  """
  args = [iter(iterable)] * n
  return izip_longest(fillvalue=fillvalue, *args)

f = open('spam.txt')
for line in grouper(22, f.split('\t')): 
    csv_writer.writerow(line[2], line[12])
0 голосов
/ 07 августа 2010

Одним из простых способов добиться этого является использование модуля csv в стандартной библиотеке.

Сначала создайте CSVReader и объект CSVWriter:

>>> import csv
>>> csv_in = csv.reader(open('eggs.txt', 'rb'), delimiter='\t')
>>> csv_out = csv.writer(open('spam.csv', 'w'), delimiter=',')

Затем просто поместите нужную информацию в новый файл CSV.

>>> for line in csv_in:
...    csv_out.writerow(line[2], line[5], line[-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...