2016-03-19 6 views
0

Я открываю файл и, если выполняется конкретное условие, открывает другой файл и переносит записи из первого файла во второй, а затем удаляет их из первого. Ниже приведен код, за исключением строки f.truncate(), которая вызывает ошибку в заголовке этого сообщения. Может ли кто-нибудь сказать мне, что мне нужно изменить, чтобы сделать эту работу?IOError: Файл не открыт для записи - Python

f = open(filename,"r") 
d = f.readlines() 
f.seek(0) 
for i in d: 
    e = i.split(',') 
    if len(e) > 28: 
     with open(filename2, "a") as text_file: 
      text_file.write(i.encode('cp1252')) 
     text_file.close 
f.truncate()   
f.close() 

ответ

4

Вы должны открыть первый файл в качестве "r+" для того, чтобы читать и писать, например, так:

f = open(filename,"r+") 
for line in f: 
    e = line.split(',') 
    if len(e) > 28: 
     with open(filename2, "a") as text_file: 
      text_file.write(line.encode('cp1252')) 
f.seek(0) 
f.truncate()   
f.close() 

Я также сделал код более эффективным, как она должна пройти по линии вместо копируя их в сторону. Еще более эффективным подходом было бы это:

with open(filename,"r+") as file1, open(filename2, "a") as file2: 
    for line in f: 
     if line.count(',') > 27: 
      file2.write(line.encode('cp1252')) 
    file1.truncate(0) 

Таким образом, вы не открыть файл каждой итерации, и так как вы не используете значения разделения, вы можете просто считать запятые (,) и сравнить до 27 вместо 28.

Удаление только скопированные строки

Если вы хотите удалить только скопированные строки, а не пустой файл, у вас нет другого пути, чем копирование всего файла в память или используя tempfile.

Это способ сделать это путем копирования в память:

with open(filename,"r+") as file1, open(filename2, "a") as file2: 
    file_lines = file1.readlines() 
    file1.seek(0) 
    file1.truncate() 
    for line in file_lines: 
     if line.count(',') > 27: 
      file2.write(line.encode('cp1252')) 
     else: 
      file1.write(line) 

Пожалуйста, убедитесь, чтобы указать кодировку, если вы используете Python 3.x.

+0

им пытаются получить его так, что только скопированные строки будут удалены, но когда я использую первый код, указанный выше, он опустошает цельные первый текстовый файл. как мне изменить, удаляются только выбранные строки? – gdogg371

+0

@ gdogg371 Обновлен мой ответ соответственно. – Bharel

+0

Ваш обновленный код неверен и испортит содержимое 'file1'. – alexis

0

Подумайте об этом, прочитав файл1, разделив его на две части и нарисуйте части файла file1 и file2. Я бы даже не заморачиваться с truncate() с момента открытия файла для записи обрезает его:

with open(filename1) as file1: 
    data = file1.readlines() 

lines1 = [] 
lines2 = [] 
for line in data: 
    if len(line.split(",")) > 28: 
     lines2.append(line) 
    else: 
     lines1.append(line) 

with open(filename1, "w", encoding='cp1252') as outfile: # Wipes out old contents 
    outfile.writelines(lines1) 

with open(filename2, "w", encoding='cp1252') as outfile: 
    outfile.writelines(lines2) 
Смежные вопросы