2013-03-27 2 views
-3

У меня есть текстовый файл с колонками. Я хочу, чтобы извлечь данные в колонке «С»Как получить значения в каждом столбце?

A   B    C 
    2013  colombo   sri lanka  
    2012  Tokyo   Japan 

flolowing код, который я использовал для поиска данных.

f = open('log.txt','r') 
data = f.read() 
import re 

#print data 

def find(pat,text): 
     match = re.search(pat,text) 
     if match: print match.group() 
     else: print 'not found!' 

x = re.findall(r'\w+:',data) 
print x 
+1

Вам нужно использовать Python? Это тривиально с утилитами оболочки. – squiguy

+0

да, я хочу сделать это с помощью python? –

+1

Я смущен ... Где используется функция «Найти»? Кроме того, можете ли вы более подробно рассказать о том, что принадлежит столбцам A, B и C? – SethMMorton

ответ

0
with open('file.txt') as filehandler: 
    for line in filehandler: 
     print line.split(maxsplit=2)[2] 

использование .split("\t") если поля разделяются вкладкой

Дополнительно к Кос ответа, вы можете разделить с помощью регулярного выражения. Вы можете попробовать расщепить слова, разделенные не более чем одним пространством:

with open('file.txt') as filehandler: 
    for line in filehandler: 
     groups = re.compile(r'((?:\w+\s?)+)').split(line) 
     print groups[1], groups[3], groups[5] 
+0

Это точно так же, как ответ Тайского Тран, и имеет ту же проблему. – abarnert

+0

maxsplit решает его. Кроме того, если файл разделен вкладкой, то вы используете '.split (" \ t ")', и у вас не будет этой проблемы –

+0

'maxsplit' решает его для этого конкретного случая, но как насчет, скажем,« 2009 Rio De Джейниро Бразилия "? Что касается '\ t'-хорошо, возможно, что он скопировал и вставил неправильно, но в противном случае нет вкладок. – abarnert

1

Ваша проблема не указана, но я могу попытаться угадать. Учитывая «Шри-Ланку» в столбце C, вы не можете просто разбить на пробелы. И если вы аккуратно ввели его, вы не используете вкладки.

Таким образом, каждый столбец начинается в определенном положении в строке: столбец A [3:12], столбец B [12:28], столбец C - [28:]. В этом случае:

[line[29:] for line in data.splitlines()[1:]] 

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

[filter(None, line.split(' '))[2] for line in data.splitlines()[1:]] 

Как оказалось, ни один из этих предположений является правильным, потому что ваш фактический формат файла ... ничего подобного, что вы показали нам, а один из standard IIS log formats. Вы все еще не сказали, какой из них, но если предположить, что это один из форматов W3C/NCSA/Common, это точно так же, как разбор любого журнала веб-сервера.

Существует несколько модулей Python, предназначенных для этого, включая apachelog и pylogsparser, но лучше всего, чтобы найти себя и посмотреть, что там есть.

+0

На самом деле я хотел получить то, что когда-либо было в поле «Refer» в файле журнала сервера IIS? Из-за конфиденциальности я не могу публиковать контент? #Fields: date time s-sitename s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs (User-Agent) cs (Referer) sc-status sc-substatus sc -win32-status –

0

Предполагая, что столбец B никогда не будет больше, чем одно слово:

# This reads each line, removes the trailing newline, then splits on whitespace 
data = [line.strip().split() for line in open('log.txt')] 

# The columns 
A = [] 
B = [] 
C = [] 
for line in data: 
    A.append(line[0]) 
    B.append(line[1]) 
    # ' '.join(list) will return a string of the list separated by whitespace 
    C.append(' '.join(line[2:])) 

print C 

C должен содержать только столбец C

+0

Кажется, что первая строка будет только «lanka». – bereal

+0

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

+0

@bereal Если sri находится в элементе 2, а lanka находится в элементе 3, строка [2:] должна возвращать элементы 2 и 3, поэтому «.join (строка [2:]) будет содержать как sri, так и lanka. – SethMMorton

1

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

Следовательно, вам понадобятся некоторые эвристики. Перспективный подход заключается в рассмотрении столбцов с разделителями, по крайней мере, 3 пробельных символов:

>>> print data 
    A   B    C 
    2013  colombo   sri lanka 
    2012  Tokyo   Japan 

>>> re.compile('\s{3,}').split(line.strip()) for line in data.splitlines()] 
[['A', 'B', 'C'], 
['2013', 'colombo', 'sri lanka'], 
['2012', 'Tokyo', 'Japan']] 

Регулярное выражение \s{3,} означает «по крайней мере, 3 пробельные символы».

+0

На самом деле я хотел прочитать файл журнала сервера IIS и узнать, что когда-либо было в поле «Refer»? Из-за конфиденциальности я не могу публиковать контент? –

+0

Почему вы выбрали ограничение по крайней мере на 3 символа пробела вместо двух? – martineau

+0

@martineau Нет причин.:-) Просто представляя идею эвристики, OP должен настроить ее, чтобы она соответствовала его фактическому входному лучшему – Kos

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