2016-05-03 5 views
2

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

Ниже приведен пример файла примера.

A B C D  
1 2 3 abcdef 
5 6 7 abcdef 
1 2 3 abcdef 

И я хочу извлечь файл, чтобы получить необходимую мне информацию. Например, выглядит как показано в моем выходном файле.

A C D  # I only need A, C, and D column. 
1 3 ab  # For D column, I only need ab. 
5 7 ab  
1 3 ab 

Это не файл csv или txt, а пробел между столбцами.

+2

Если это не текстовый файл, какой файла? – wim

+0

Я думаю, что OP говорит о расширении, а не о формате. –

ответ

6

Вы все еще можете прочитать разделенные пробела файл с модулем CSV, используя разделитель kwarg:

>>> with open('/tmp/data.txt') as f: 
... reader = csv.DictReader(f, delimiter=' ') 
... for row in reader: 
...  print row['A'], row['C'], row['D'][:2] 
...   
1 3 ab 
5 7 ab 
1 3 ab 
+0

Спасибо, но если у меня есть сотни столбцов, таких как столбец D, который требуется выбрать, критерий выбора тот же (т. Е. [: 2]) есть ли у вас какие-либо идеи, как это сделать? – BigSecrect

+1

Составьте список этих столбцов, а затем переверните его – wim

1

Если вы хотите сделать что-то родовое для управления структурами данных проще всего можно сделать, это использовать питон библиотека чтобы облегчить работу.

Вы можете использовать библиотеку анализа данных Pandas Lib: Python для быстрого анализа файла на DataFrame, который предоставляет методы для создания того, что вы хотите.

Вам также нужно Numpy lib, потому что метод as_matrix (ниже) возвращает numpyArray.

Файл данных вы можете видеть как файл csv (Comma separated value) с пробелами в качестве разделителей.

палладием можно легко разобрать файл с read_csv:

import pandas as pd 
import numpy as np 
dataFrame = pd.read_csv("file.txt", sep = ' ') 

Для выбора столбцов используется метод as_matrix:

selection = dataFrame.as_matrix((A,C,D)) 

Тогда вы, вероятно, хотите можете бросить его обратно dataFrame продолжить используя его методы:

newDataFrame = pd.DataFrame(selection) 

Удаление «cdef» значений «abcdef» в столбце D выглядит как вещь, которая может быть решена простым для и с использованием методов [String] [5], предоставляемых Python. Это очень специфическая инструкция, и я не знаю какого-либо внедренного метода любой библиотеки, которая это выполняет.

Надеюсь, я помог вам.

PD: Я попытался опубликовать много ссылок, но система не позволяла мне. Я рекомендую вам искать Numpy и Pandas в Google, если у вас их нет. Вы должны проверить документы pandas DataFrame, чтобы проверить методы. Я в том случае, когда вы не понимали, что я искал pandas.read_csv, pandas.dataFrame.as_matrix docs в Google.

И если вы не знаете, как управлять строками, посмотрите в документах Python для String.

Редактировать: Во всяком случае, если вы не хотите использовать библиотеки libs, вы можете разделить файл txt на список списков, имитирующих матрицу, или используя структуру csv, которая упоминается в его ответе. Затем создайте функцию для удаления столбцов, проверяя первый элемент каждого столбца (Идентификатор столбца) и с некоторыми для экспорта в другую матрицу.

Затем создайте еще одну функцию, которая удаляет требуемые значения столбца, с некоторыми другими для s.

Дело в том, что использование функций для достижения того, что вы хотите, делает решение универсальным для любой таблицы, управляемой как матрица.

1

Если у вас есть более одного столбца, как D и хотите сделать то же самое, что и D, вы можете сделать ниже, если вы нормально с выбора столбцов с номерами вместо букв:

# your data like this 
A B C D E 
1 2 3 abcdef abbbb 
5 6 7 abcdef abbbb 
1 2 3 abcdef abbbb 

You import csv затем

>>> with open('yourdata.txt') as f: 
...  reader = csv.reader(f, delimiter=' ') 
...  for row in reader: 
...   print(row[0], row[1], *[c[:2] for c in row[3:]]) 
... 
A B D E 
1 2 ab ab 
5 6 ab ab 
1 2 ab ab 

* оператор перед [c[:2] for c in row[3:]] для списка аргументов распаковка. * в основном преобразует [1,2,3] в 1,2,3, поэтому print(*[1,2,3]) идентичен print(1,2,3). Работает также с кортежами.

Однако это python3. Если вы используете python2, print даст вам синтаксическую ошибку, но вы можете создать функцию-оболочку, которая принимает в распакованных аргументах списка, и заменить print с этой функцией:

def myprint(*args): 
    print ' '.join([str(i) for i in args]) 
+0

Спасибо, но он показывает сообщение об ошибке «Синтаксическая ошибка при обнаружении кортежа». Любое предложение? – BigSecrect

+1

@BigSecrect Я только понял, что я использую python3, и вы используете python 2.7, в котором печать ведет себя по-другому, а распаковка списка может использоваться только в аргументах функции. Так что это может быть немного излишним, но вы можете сделать это: 'def p (* args): print '' .join ([str (i) для i в args])' затем замените часть 'print' этой функцией , – neilxdims

Смежные вопросы