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

text
(starts with parentheses)
         tabbed info
text
(starts with parentheses)
         tabbed info

...repeat

Я хочу извлечь только «текстовые» строки из файла (или каждую четвертую строку) и скопировать их в другой файл. Вот код, который у меня есть, но он копирует все в новый файл:

import sys

def process_file(filename):

    output_file = open("data.txt", 'w')

    input_file = open(filename, "r")
    for line in input_file:
        line = line.strip()
                if not line.startswith("(") or line.startswith(""):
                        output_file.write(line)        
    output_file.close()
if __name__ == "__main__":
process_file(sys.argv[1])
0
Timmay 7 Авг 2010 в 23:03

5 ответов

Лучший ответ

В дополнение к тому, что line.startswith("") всегда имеет значение true, line.strip() удалит ведущую вкладку, заставляя также записывать данные с вкладками. измените его на line.rstrip() и используйте \t для проверки вкладки. Эта часть вашего кода должна выглядеть так:

line = line.rstrip()
if not line.startswith(('(', '\t')):
    #....

В ответ на ваш вопрос в комментариях:

#edited in response to comments in post
for i, line in input_file:
    if i % 4 == 0:
        output_file.write(line)
0
aaronasterling 7 Авг 2010 в 20:40

Таким образом, проблема в том, что (1) вы неправильно используете логическую логику, и (2) каждая возможная строка начинается с «».

Во-первых, логическая логика:

Оператор or работает так, что он возвращает True, если любой из его операндов равен True. Операндами являются «не line.startswith ('(')» и «line.startswith ('')». Обратите внимание, что это относится не только к одному из операндов. Если вы хотите применить его к общему результату или Вы должны будете поместить все это в скобки.

Второй проблемой является использование вами метода startwith () с сильной нулевой длиной в качестве аргумента. По сути, это говорит «соответствует любой строке, где первые нулевые символы - ничто. Это соответствует любому значению, которое вы можете дать.

Смотрите другие ответы для того, что вы должны делать здесь.

0
jcdyer 8 Авг 2010 в 15:20

Пытаться:

if not line.startswith("(") and not line.startswith("\t"):

Без использования line.strip () (это уберет вкладки)

0
Andre Holzner 7 Авг 2010 в 19:24
with open('data.txt','w') as of:
    of.write(''.join(textline
                     for textline in open(filename)
                     if textline[0] not in ' \t(')
             )

Для записи каждой четвертой строки используйте результат среза [:: 4]

with open('data.txt','w') as of:
    of.write(''.join([textline
                     for textline in open(filename)
                     if textline[0] not in ' \t('][::4])
             )

Мне не нужно разбивать строки, так как я использую их с write.

1
Tony Veijalainen 7 Авг 2010 в 20:18

Причина, по которой ваш скрипт копирует каждую строку, заключается в том, что line.startswith("") имеет значение True, независимо от того, что line равно.

Вы можете попробовать использовать isspace, чтобы проверить, начинается ли line с пробела:

def process_file(filename):
    with open("data.txt", 'w') as output_file:
        with open(filename, "r") as input_file:
            for line in input_file:
                line=line.rstrip()
                if not line.startswith("(") or line[:1].isspace():
                    output_file.write(line) 
1
unutbu 7 Авг 2010 в 19:37