2009-12-19 3 views
2

Как игнорировать строки в файле?Python - игнорировать строки в файле

Пример:

Если вы знаете, что первые строки в файле будут начинаться с скажем, а или б, а остальные строки заканчиваются с, как же разобрать файл так, что строки, начинающиеся а или б игнорируются, а строки, заканчивающиеся на c, преобразуются во вложенный список?

То, что я до сих пор:

fname = raw_input('Enter file name: ') 

z = open(fname, 'r') 

#I tried this but it converts all lines to a nested list 

z_list = [i.strip().split() for i in z] 

Я предполагаю, что мне нужно для цикла.

for line in z: 
    if line[0] == 'a': 
     pass 
    if line[0] == 'b': 
     pass 
    if line[-1] == 'c': 
     list_1 = [line.strip().split()] 

Выше была общая идея, но я эксперт по созданию мертвого кода! Как сделать его нежити?

Thanks, Seafoid.

+2

Я бы превратил его в обычный цикл, возможно, для проверки каждой строки. Когда вы добавляете дополнительные условия, понимание списка быстро становится громоздким. – Skurmedel

ответ

9

startswith может принять кортеж строк, чтобы соответствовать, так что вы можете сделать это:

[line.strip().split() for line in z if not line.startswith(('a', 'b'))] 

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

[ 
    line.strip().split() 
    for line in z if line.endswith('c') and not line.startswith(('a', 'b')) 
] 
+0

Попытка подумать о том, как вы могли бы сделать это короче ... но я не думаю, что вы можете. – Skurmedel

+0

Мне это нравится и на самом деле понимаю. К сожалению, он печатает пустой список. Я должен делать что-то неправильно! –

+0

@ Сейфоид, вы уверены? Я просто попробовал его в локальном файле, и он работал нормально. Может быть, вы дважды читаете файл? только чтение работает только –

1

Один из способов сделать это - заменить 'pass' на 'continue'. Это будет продолжаться до следующей строки в файле без каких-либо действий. Вам также необходимо добавить строку в list_1

if line[-1] == 'c': 
    list_1.append([line.strip().split()]) 
2

Вы можете добавить if условия списковых.

z_list = [i.strip().split() for i in z if i[-1] == 'c'] 

или

z_list = [i.strip().split() for i in z if (i[0] <> 'a' and i[0] <> 'b')] 
+0

<> устарел в пользу! =, А startswith и endswith более ясны в этом контексте. –

+0

Правда. Основная идея здесь была в основном сформулирована в первом предложении - факт, что вы можете фильтровать списки, используя условия 'if'. – Amber

3

Один очень общий подход к «фильтр» файл, удалив некоторые строки:

import itertools 
zlist = [l.strip.split() for l in itertools.ifilter(lambda line: line[0] not in 'ab', z)] 

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

Похожая, но синтаксически простой подход, который достаточно в вашем случае (и которые, таким образом, я бы рекомендовал из-за силу простоты), чтобы сделать «фильтрацию» с if пункта в listcomp:

zlist = [l.strip.split() for l in z if l[0] not in 'ab'] 
+0

Я все еще разбираюсь в основах python, поэтому я стараюсь не импортировать модули. Мне нужно изобретать колесо, чтобы узнать код! Я отмечу это, когда буду более опытным. Благодаря! –

0
f=open("file") 
for line in f: 
    li=line.strip() 
    if not li[0] in ["a","b"] and li[-1]=="c": 
     print line.rstrip() 
f.close() 
0

Для заинтересованных в решении.

А также, другой вопрос!

Пример Формат файла:

c this is a comment 
p m 1468 1 267 
260 32 0 
8 1 0 

Код:

fname = raw_input('Please enter the name of file: ') 

z = open(fname, 'r') 

required_list = [line.strip().split() for line in z if not line.startswith(('c', 'p'))] 

print required_list 

Выход:

[['260', '32', '0'], ['8', '1', '0']] 

Любые предложения о том, как преобразовать строки в списках целыми числами и выполнять арифметические операции ?

псевдокод для иллюстрации:

#for the second item in each sublist 
    #if sum is > than first number in second line of file 
     #pass 
    #else 
     #abort/raise error 

веселит людей за ваши предложения до сих пор, Seafoid.

@ Надя, мой день кажется немного более стоящим сейчас! Я потратил часы (даже дни), пытаясь взломать это соло! Благодаря!

+0

int() преобразует допустимую строку (или другое допустимое представление, подобное float) в целое число. Коротким и наивным решением для преобразования списка строк в числа будет map (int, numberStrings). Это отображает функцию «int» для каждой строки в списке. Просто следите за недопустимыми значениями, что даст исключение. – Skurmedel

+2

@Seafoid: Пожалуйста, используйте кнопку «Задать вопрос», чтобы задать новые вопросы (если вопросы связаны, тогда вставьте ссылку (каждый вопрос/ответ имеет URL-адрес)). – jfs

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