2014-12-30 3 views
0

У меня есть текстовый файл со следующими данными:Удалить запись из файла

3455155, 117465776, 29972373, 27226577, 64735238 

Мне нужно удалить запись из этого файла, например: 3455155

I`m пытается следующее:

def remove_entry_from_file(entry_id): 
    f = open(file.txt, 'w+') 
    data = f.read() 
    new_data = re.sub(entry_id + '[, ]*', '' ,data) 
    f.write(new_data) 
    f.close() 

В результате - файл будет полностью очищен. Где я ошибаюсь?

+0

Я изменил режим с w + на r + и new_data стал непустым и правильным. Но я получил следующую ошибку, а f.write: «IOError: [Errno 0] Error» –

+0

Это работа для меня, можете ли вы снова пройти свой обновленный код? –

ответ

6

Если вы откроете w+, файл будет опустошен.

Вместо этого используйте r+. если вы это сделаете, вам придется перемотать свой файл перед записью и, возможно, впоследствии усечь его.

def remove_entry_from_file(entry_id): 
    f = open(file.txt, 'r+') 
    data = f.read() 
    new_data = re.sub(entry_id + '[, ]*', '' ,data) 
    f.seek(0) 
    f.write(new_data) 
    f.truncate() 
    f.close() 
+0

Сейчас он работает, спасибо!) –

2

Проблема заключается в том, когда вы открываете файл в w он автоматически усекается, так что вы ничего не читаете:

[email protected]:~/t$ cat foo.txt 
0 
aaaa 
bbbb 
cddd 
dddddddd 

Long sentence here which is not even read completely 

The rest is ignored... 
[email protected]:~/t$ python 
Python 2.7.3 (default, Jan 2 2013, 16:53:07) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> f = open('foo.txt', 'w+') 
>>> f.read() 
'' 

Вы, вероятно, хотите, чтобы открыть файл в режиме добавления 'a'; или открыть файл для чтения, закрыть файл, а затем открыть файл для записи и записи новой строки.

Открытие его для записи очистит содержимое файла.

1

Другим решением было бы открыть файл дважды, один раз для чтения данных, один раз написать:

def remove_entry_from_file(entry_id): 
    with open('file.txt', 'r') as f: 
     data = f.read() 

    new_data = re.sub(entry_id + '[, ]*', '' ,data) 

    with open('file.txt', 'w+') as f: 
     f.write(new_data) 

Здесь context managers (блоки кода после with ... as ...:) заботиться о закрытии файла для вас.

Смежные вопросы