Как мне написать только определенные строки в файл в Python? - PullRequest
0 голосов
/ 07 августа 2010

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

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])

Ответы [ 5 ]

1 голос
/ 07 августа 2010
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])
             )

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

1 голос
/ 07 августа 2010

Причина, по которой ваш скрипт копирует каждую строку, заключается в том, что line.startswith("") - это Истина, независимо от того, что равно 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) 
0 голосов
/ 07 августа 2010

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

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

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

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

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

0 голосов
/ 07 августа 2010

попробовать:

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

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

0 голосов
/ 07 августа 2010

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