У меня есть файл, который выглядит следующим образом (нужно положить в поле кода, чтобы он напоминал файл):
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 ответов
В дополнение к тому, что 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)
Таким образом, проблема в том, что (1) вы неправильно используете логическую логику, и (2) каждая возможная строка начинается с «».
Во-первых, логическая логика:
Оператор or работает так, что он возвращает True, если любой из его операндов равен True. Операндами являются «не line.startswith ('(')» и «line.startswith ('')». Обратите внимание, что это относится не только к одному из операндов. Если вы хотите применить его к общему результату или Вы должны будете поместить все это в скобки.
Второй проблемой является использование вами метода startwith () с сильной нулевой длиной в качестве аргумента. По сути, это говорит «соответствует любой строке, где первые нулевые символы - ничто. Это соответствует любому значению, которое вы можете дать.
Смотрите другие ответы для того, что вы должны делать здесь.
Пытаться:
if not line.startswith("(") and not line.startswith("\t"):
Без использования line.strip () (это уберет вкладки)
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.
Причина, по которой ваш скрипт копирует каждую строку, заключается в том, что 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)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.