Python - игнорировать строки в файле - PullRequest
2 голосов
/ 19 декабря 2009

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

Пример:

Если вы знаете, что первые строки в файле начинаются с, скажем, a или b, а остальные строки заканчиваются на c, как можно проанализировать файл, чтобы строки, начинающиеся с a или b, игнорировались, а строки, заканчивающиеся 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.

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

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

Спасибо, Seafoid.

Ответы [ 6 ]

9 голосов
/ 19 декабря 2009

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

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

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

[
    line.strip().split()
    for line in z if line.endswith('c') and not line.startswith(('a', 'b'))
]
3 голосов
/ 19 декабря 2009

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

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']
2 голосов
/ 19 декабря 2009

Вы можете добавить 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')]
1 голос
/ 19 декабря 2009

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

if line[-1] == 'c':
    list_1.append([line.strip().split()])
0 голосов
/ 19 декабря 2009

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

А также еще один вопрос!

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

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 голосов
/ 19 декабря 2009
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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...