Вместо того, чтобы читать весь файл в память, вы должны перебирать файл и написать строки, которые 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
Вы имеете в виду 'if line! = Word +" \ n "'? – mvelay
да, извините, это была почта перед словом, и я забыл ее изменить :) –
'delete-row'? Это не имеет ничего общего с базами данных. –