2009-06-11 6 views
2

Я пытаюсь заменить строку во всех файлах в текущем каталоге. по какой-то причине мой временный файл заканчивается пустым. Кажется, мой .write не работает, потому что второй файл был объявлен вне его области возможно? Я новичок в python, так что все еще поднимаюсь на кривую обучения ... спасибо!файл не будет писать в python

Редактировать: Я знаю, что мой tempfile не копируется в настоящее время. Я также знаю, что есть гораздо более эффективные способы сделать это. Я делаю это так для практики. Если кто-то может ответить конкретно, почему метод .write не работает здесь, это было бы здорово. Благодаря!

import os 
import shutil 


for filename in os.listdir("."): 
    file1 = open(filename,'r') 
    secondfile = open("temp.out",'w') 
    print filename 
    for line in file1: 
     line2 = line.replace('mrddb2.','shpdb2.') 
     line3 = line2.replace('MRDDB2.','SHPDB2.') 
     secondfile.write(line3) 
    print 'file copy in progress' 
    file1.close() 
    secondfile.close() 
+0

исправить ваш отступ, пожалуйста – SilentGhost

+0

отлично выглядит на моей машине. как это неправильно? – 2009-06-11 23:21:12

+1

Как именно это происходит? Вы получаете ошибку времени выполнения или просто не можете найти temp.out? –

ответ

0

Во-первых,

вы забыли скопировать временный файл обратно на оригинал.

Во-вторых:

использование СЭД -i или Perl -i вместо питона.

Например:

perl -i -pe 's/mrddb2/shpdb2/;s/MRDDB2/SHPDB2/' * 
+0

Почему я столкнулся с этим ответом? Я нарушил правило, рекомендуя другой язык? –

+1

Alex, это довольно очевидно, что это вопрос, специфичный для Python (либо для курса, либо просто для общего назидания). Очевидно, что sed более полезен. –

+0

Hang on, первое предложение: Я пытаюсь заменить строку во всех файлах в текущем каталоге Если кто-то на моем рабочем месте сказал об этом, я бы сказал им, что я буду делать - perl. –

0

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

print secondfile.read()

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

print secondfile.read()[:n]

Если n = 100 будет ограничивать выход до 100 символов.

2

Ваш код (правильно отложенный, хотя я не думаю, что есть способ отступы, чтобы он работал, но не работает правильно) на самом деле кажется правильным. Имейте в виду, что temp.out будет замененным содержимым только последнего исходного файла. Может быть, этот файл просто пуст?

+0

Это тоже мое предположение ... Каким правильным способом было бы открыть его, чтобы получить копию содержимого всех файлов, а не только последнюю? "Ш +"? «А»? "А +"? – Jaime

+0

a позволит вам объединить все файлы замещения в результат. –

5

Просто взглянув на вещи, кажется, что ваша проблема связана с «w».

Похоже, вы храните , переписывая, а не прилагается.

Итак, вы в основном перебираете файлы,
, и к концу вы только скопировали последний файл в ваш временный файл.

Возможно, вам захочется открыть файл с помощью 'a' вместо 'w'.

+0

Это не совсем так. Он записывает полное содержимое первого файла, затем перезаписывает его полным содержимым второго файла и т. Д. –

+0

Спасибо Matt. Вы абсолютно правы. Я исправил свои формулировки. – bernie

+2

+1 для единственного полезного ответа здесь. Это означает, что если последний файл пуст, temp.out будет пустым в конце цикла. – NicDumZ

0

если ваш код на самом деле отступом, как показано в сообщении, запись работает нормально. Но если он не работает, вызов записи может быть за пределами внутреннего цикла.

0

Просто, чтобы убедиться, что я чего-то не пропустил, я проверил код, и он отлично работал для меня. Возможно, вы можете попробовать продолжить все, кроме одного определенного имени файла, а затем проверить содержимое temp.out после этого.

import os 

for filename in os.listdir("."): 
    if filename != 'findme.txt': continue 
    print 'Processing', filename 
    file1 = open(filename,'r') 
    secondfile = open("temp.out",'w') 
    print filename 
    for line in file1: 
     line2 = line.replace('mrddb2.','shpdb2.') 
     line3 = line2.replace('MRDDB2.','SHPDB2.') 
     print 'About to write:', line3 
     secondfile.write(line3) 
    print 'Done with', filename 
    file1.close() 
    secondfile.close() 

Кроме того, как уже упоминалось, вы просто затирания файла файла temp.out каждый раз, когда вы обрабатываете новый файл. Вы также импортировали shutil, ничего не делая с ним. Вы забываете скопировать temp.out обратно в исходный файл?

0

Я заметил, что иногда он не будет печататься в файл, если у вас нет файла .close после файла file.write.

Например, эта программа фактически никогда не сохраняет в файл, он просто делает пустой файл (если не добавить outfile.close() сразу после outfile.write.)

outfile=open("ok.txt","w") 

fc="filecontents" 

outfile.write(fc.encode("utf-8")) 


while 1: 

    print "working..." 
0

@OP, вы могли бы тоже хочу попробовать модуль FileInput (таким образом, вы не должны использовать свой собственный временный файл)

import fileinput 
for filename in os.listdir("."): 
    for line in fileinput.FileInput(filename,inplace=1): 
     line = line.strip().replace('mrddb2.','shpdb2.') 
     line = line.strip().replace('MRDDB2.','SHPDB2.') 
     print line 

набор «INPLACE» 1 для редактирования файла на месте. Установите для 0 для обычной печати в стандартный вывод