2015-06-21 3 views
3

Я пытаюсь прочитать конкретный контент файла file1.txt и записать этот конкретный контент в другой файл file2.txt. Проблема в том, что я прочитал целую часть после бара, где хочу читать только начало строки с [x] и только с секцией Bar.Чтение и запись определенного содержимого

Исходный код

def read_write_file_content(): 
    data_file = open('file1.txt') 
    block = "" 
    found = False 

    for line in data_file: 
     if found: 
      if line.strip() == "##### Foo": 
       break 
      else: 
       block += line 

     else: 
      if line.strip() == "##### Bar:": 
        found = True 
        block = line 
    print block 




    data_file.close() 

view_today() 

входного файла file1.txt

##### Xyz 
* [] Task 112 
* [] Cl 221 

##### Foo 
* [] Task 1 
* [x] Clone 2 


##### Bar: 
* [x] Email to A 
* [] Email to B 
* [x] Email to C 
##### Bob 
* [] Task 3 
* [x] Clone Bob 

Outputfile file2.txt

##### Bar: 
* [x] Email to A 
* [x] Email to C 

Любое предложение будет в значительной степени оценено? Спасибо :)

Subsequent question

+0

Пожалуйста, добавьте конкретное заявление о проблеме - «это не работает» можно предположить, но * как это сделать? Какое сообщение об ошибке или неправильное поведение характерны? –

+0

если '[x]' в строке:? –

+0

есть. [x] находится в начале строки. Некоторые строки [], которые не являются нашими соображениями. – Roujri

ответ

1

Прежде всего, вам нужно определить, находитесь ли вы в блоке «Бар». Затем, пока вы, напечатайте/скопируйте те строки, которые начинаются с * [x]. Вот один из способов сделать это:

def get_selected_block_entries(lines, block_name, 
           block_prefix='#####', selected_entry_prefix='* [x]'): 
    selected_lines = [] 

    block_marker = '{} {}'.format(block_prefix, block_name) 
    for line in lines: 
     if line.startswith(block_prefix): 
      in_block = line.startswith(block_marker) 
      if in_block: 
       selected_lines.append(line) 
     else: 
      if in_block and line.startswith(selected_entry_prefix): 
       selected_lines.append(line) 

    return selected_lines 

with open('file1.txt') as infile, open('file2.txt', 'w') as outfile: 
    selected = get_selected_block_entries(infile, 'Bar:') 
    print selected # a list of selected entries within a Bar: block 
    outfile.writelines(selected) 

Запуск выше код, когда file1.txt содержит:

 
##### Foo 
* [] Task 1 
* [x] Clone 2 


##### Bar: 
* [x] Email to A 
* [] Email to B 
* [x] Email to C 

##### Foo 
* [] Task 1 
* [x] Clone 2 

печатает:

 
['##### Bar:\n', '* [x] Email to A\n', '* [x] Email to C\n'] 

который список возвращается из функции get_selected_block_entries(). Аналогично file2.txt содержит:

 
##### Bar: 
* [x] Email to A 
* [x] Email to C 

Этот выход показывает, что выбранные записи, следующие за «Бар:» Блок не собираются.

Также обратите внимание, что выбранные записи будут собираться из всех соответствующих блоков, если их более одного, например.

get_selected_block_entries(infile, 'Foo') возвратит выбранные элементы из блоков два Foo:

['##### Foo\n', '* [x] Clone 2\n', '##### Foo\n', '* [x] Clone 2\n'] 

И, если вы когда-нибудь хотели, чтобы выбрать все выбранные элементы из всех блоков, которые вы могли бы сделать это:

get_selected_block_entries(infile, '') 
+0

было отличное решение. Благодаря :) – Roujri

1

Вы, вероятно, хотите, чтобы проверить, является ли данная строка начинается с "* [x]".

import re 
section = None 
for line in data_file: 
    sre = re.match("^#####\s*(\w):\s*",line) 
    if sre: 
     section = sre.group(1) 
    if line.startswith("* [x]") and section == "Bar": 
      block += line 

Посмотрите here для получения дополнительной информации об использовании регулярных выражений в Python.

+0

спасибо. Однако я не могу получить ожидаемый результат. Проблема в том, что я получаю все строки после того, как баровый блок начинается с * [x], где я хочу, чтобы в блоке Bar – Roujri

2

Включить и выключить found путем обнаружения разделов. Когда foundTrue фильтрует линии с помощью '[x]' in line.

found = False 

for line in open('file1.txt'): 
    line = line.strip() 
    if not line: 
     continue 
    if line.startswith('#####'): 
     if line == '##### Bar:': 
      found = True 
      print(line) 
     else: 
      if found: 
       break 
     continue 

    if found and '[x]' in line: 
     print(line) 
Смежные вопросы