2012-04-18 8 views
2

Вот мой код:Проверьте, существует ли файл не удается

# header.py 

def add_header(filename): 
    header = '"""\nName of Project"""' 
    try: 
     f = open(filename, 'w') 
    except IOError: 
     print "Sorry could not open file, please check path" 
    else: 
     with f: 
      f.seek(0,0) 
      f.write(header) 
     print "Header added to", filename 

if __name__ == "__main__": 
    filename = raw_input("Please provide path to file: ") 
    add_header(filename) 

Когда я запускаю этот скрипт (делая питона header.py), даже когда я обеспечиваю имя файла, который не существует, она не верните сообщения в функцию. Он ничего не возвращает, даже когда я заменяю утверждения print операциями return. Как я могу показать сообщения в функции?

+11

Похоже, вы всегда создаете файл с 'w', правильно? – octopusgrabbus

+0

@octopusgrabbus Возможно, вы захотите превратить это в ответ - так как это ответ. –

+1

Работает для меня.Что именно вы подразумеваете под «не возвращает сообщения»? – geoffspear

ответ

2

Это слегка измененная версия решения Lattywares. Поскольку невозможно добавить данные в начало файла, все содержимое считывается, и файл записывается заново, включая ваш заголовок. Открыв файл в режиме чтения/записи, мы можем выполнять обе операции с одним и тем же файловым обработчиком, не выпуская его. Это должно обеспечить некоторую защиту от условий гонки.

try: 
    with open(filename, 'r+') as f: 
     data = f.read() 
     f.seek(0,0) 
     f.write(header) 
     f.write(data) 
     #f.truncate() is not needed here as the file will always grow 
    print("Header added to", filename) 
except IOError: 
    print("Sorry, could not open file for reading/writing") 
+1

+1 - это лучшее решение, чем мое, я не знал, что '' r + '' не создаст файл. Этот метод имеет то преимущество, что вам не нужно читать весь файл (который может использовать большую память с большими файлами) и состояние гонки, как вы упомянули. –

+0

Я действительно хотел добавить это в качестве комментария к вашему решению, но, видимо, мне еще не разрешено это делать;) – pwuertz

+0

Публикация в виде отдельного ответа - вот что нужно сделать здесь - это другое, лучшее решение - вы заслуживаете кредит для него. –

3

Я считаю, что вы всегда создаете файл. Таким образом, вы не увидите, чтобы в файле не было исключения. Не помешает писать запись или файл открывать запись в try за исключением, потому что у вас могут не быть привилегии для создания файла.

Я нашел с операторами, такими как try за исключением и еще, чтобы проверить их в командной строке Python, что является очень отличным местом для устранения ошибки в кабине экипажа, и я очень опытен в создании большого количества ошибок в кабине экипажа, из концепции.

Тот факт, что вы используете try, кроме очень хорош. Мне просто нужно посмотреть, что происходит, когда логический поток проходит через один из них. Командная строка - это хорошее место для этого.

3

Правильный курс действий здесь - попробовать и прочитать файл, если он работает, прочитать данные, а затем записать в файл новые данные.

Запись в файл создаст файл, если он не существует, и перезапишет существующее содержимое.

Я также заметьте вы используете с утверждением в нечетным образом, считают:

try: 
    with open(filename, 'w') as f: 
     f.seek(0,0) 
     f.write(header) 
    print("Header added to", filename) 
except IOError: 
    print("Sorry could not open file, please check path") 

Этот способ более удобным для чтения.

Чтобы посмотреть, как это сделать, можно найти наилучшим образом, см. user1313312's answer. Мой метод работает, но это не лучший способ, я оставлю его для объяснения.


Старый ответ:

Теперь, чтобы решить вашу проблему, вы действительно хотите сделать что-то вроде этого:

def add_header(filename): 
    header = '"""\nName of Project"""' 
    try: 
     with open(filename, 'r') as f: 
      data = f.read() 
     with open(filename, 'w') as f: 
      f.write(header+"\n"+data) 
     print("Header added to"+filename) 
    except IOError: 
     print("Sorry could not open file, please check path") 

if __name__ == "__main__": 
    filename = raw_input("Please provide path to file: ") 
    add_header(filename) 

Как мы только выбор записи в файл (перезапись существующее содержимое) и добавление (в конце) нам нужно построить способ добавления данных. Мы можем сделать это, читая содержимое (которое одновременно проверяет файл одновременно), а затем записывая заголовок, за которым следует содержимое (здесь я добавил новую строку для чтения).

+0

Благодарим вас, я буду использовать читаемый формат кода. – Neeran

-1

этот скрипт открывает файл в режиме «w» (режим записи), что означает, что когда доза файла не существует, она будет создана. Итак, нет IOError.

+0

Зачем давать это как ответ, когда многие люди уже указали это? –

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