2016-06-01 5 views
-2

Я новичок в питоне, и сейчас я практикую.Удаление строки из нескольких файлов в python

Так что я хочу сделать, это сценарий, который находит строку, которую я пишу с помощью raw_input, и которая будет искать эту строку в нескольких файлах и удалять ее. Что-то вроде этого, но больше файлов:

word = raw_input("word: ") 
f = open("file.txt","r") 
lines = f.readlines() 
f.close() 
f = open("file.txt","w") 
for line in lines: 
    if line!=mail+"\n": 
    f.write(line) 
f.close() 

Это легкая задача, но на самом деле это трудно для меня, так как я не могу найти пример в любом месте.

+0

Вы имеете в виду 'if line! = Word +" \ n "'? – mvelay

+0

да, извините, это была почта перед словом, и я забыл ее изменить :) –

+0

'delete-row'? Это не имеет ничего общего с базами данных. –

ответ

0

Вместо того, чтобы читать весь файл в память, вы должны перебирать файл и написать строки, которые OK во временный файл. После того как вы просмотрели весь файл, удалите его и переименуйте временный файл в имя исходного файла. Это классический образец, который, скорее всего, встречается в будущем.

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

Чтобы получить имена файлов всех файлов в каталоге, используйте os.walk. Если вы не хотите применять эту функцию ко всем файлам в каталоге, вы можете самостоятельно установить переменную files, чтобы сохранить любую конфигурацию нужных вам файлов.

import os 


def remove_line_from_file(filename, line_to_remove, dirpath=''): 
    """Remove all occurences of `line_to_remove` from file 
    with name `filename`, contained at path `dirpath`. 
    If `dirpath` is omitted, relative paths are used.""" 
    filename = os.path.join(dirpath, filename) 
    temp_path = os.path.join(dirpath, 'temp.txt') 

    with open(filename, 'r') as f_read, open(temp_path, 'w') as temp: 
     for line in f_read: 
      if line.strip() == line_to_remove: 
       continue 
      temp.write(line) 

    os.remove(filename) 
    os.rename(temp_path, filename) 


def main(): 
    """Driver function""" 
    directory = raw_input('directory: ') 
    word = raw_input('word: ') 

    dirpath, _, files = next(os.walk(directory)) 

    for f in files: 
     remove_line_from_file(f, word, dirpath) 

if __name__ == '__main__': 
    main() 

ТЕСТЫ

Все эти файлы находятся в том же каталоге. Слева - это то, как они выглядели, прежде чем запускать команду, справа - то, что они выглядят впоследствии. Вход «word» I был Remove this line.

a.txt

Foo           Foo 
Remove this line        Bar 
Bar           Hello 
Hello           World 
Remove this line 
Remove this line 
World 

b.txt

Nothing          Nothing 
In           In 
This File          This File 
Should          Should 
Be Changed         Be Changed 

c.txt

Remove this line 

d.txt

The last line will be removed     The last line will be removed 
Remove this line        
+0

Я получаю это: –

+0

TraceBack (самый последний вызов последним): Файл "C: \ Mailuri Мари \ junk.py", строка 31, в основной() Файл «C: \ Mailuri Mari \ барахло. py ", строка 26, в основном dirpath, _, files = os.walk (directory) ValueError: требуется больше 0 значений для распаковки –

+0

Упс ... это была ошибка с моей стороны. Должно быть исправлено сейчас! – pzp

0

что-то, как это должно работать:

source = '/some/dir/path/' 
for root, dirs, filenames in os.walk(source): 
    for f in filenames: 
     this_file = open(os.path.join(source, f), "r") 
     this_files_data = this_file.readlines() 
     this_file.close() 
     # rewrite the file with all line except the one you don't want 
     this_file = open(os.path.join(source, f), "w") 
     for line in this_files_data: 
      if line != "YOUR UNDESIRED LINE HERE": 
       this_file.write(line) 
     this_file.close() 
Смежные вопросы