файл не будет писать на питоне - PullRequest
2 голосов
/ 12 июня 2009

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

edit: я знаю, что мой временный файл в настоящее время не копируется. Я также знаю, что есть гораздо более эффективные способы сделать это. Я делаю это таким образом для практики. Если бы кто-то мог ответить конкретно, почему метод .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()

Ответы [ 8 ]

5 голосов
/ 12 июня 2009

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

Похоже, вы продолжаете перезаписывать , а не добавляя .

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

Возможно, вы захотите открыть файл с «a» вместо «w».

2 голосов
/ 12 июня 2009

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

0 голосов
/ 11 июля 2009

@ 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

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

0 голосов
/ 11 июля 2009

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

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

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

fc="filecontents"

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


while 1:

    print "working..."
0 голосов
/ 12 июня 2009

Просто чтобы убедиться, что я ничего не пропустил, я проверил код, и он работал нормально для меня. Возможно, вы можете попробовать продолжить для всех, кроме одного конкретного имени файла, а затем проверить содержимое файла 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 голосов
/ 12 июня 2009

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

0 голосов
/ 12 июня 2009

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

print secondfile.read()

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

print secondfile.read()[:n]

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

0 голосов
/ 12 июня 2009

Во-первых,

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

Во-вторых:

используйте sed -i или perl -i вместо python.

Например:

perl -i -pe 's/mrddb2/shpdb2/;s/MRDDB2/SHPDB2/' *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...