2015-01-06 3 views
0

У меня есть следующий метод в Python.Как создать файл в python, если он не существует

def get_rum_data(file_path, query): 
    if file_path is not None and query is not None: 
     command = FETCH_RUM_COMMAND_DATA % (constants.RUM_JAR_PATH, 
              constants.RUM_SERVER, file_path, 
              query) 
     print command 
     execute_command(command).communicate() 

Теперь внутри get_rum_data мне нужно создать файл, если он не существует, если она существует, я должен добавить данные. Как это сделать в python.

Я пробовал, open(file_path, 'w'), что дало мне исключение.

Traceback (most recent call last): 
    File "utils.py", line 180, in <module> 
    get_rum_data('/User/rokumar/Desktop/sample.csv', '\'show tables\'') 
    File "utils.py", line 173, in get_rum_data 
    open(file_path, 'w') 
IOError: [Errno 2] No such file or directory: '/User/rokumar/Desktop/sample.csv' 

Я, хотя открытый, создавал бы файл в режиме записи.

+1

Вы часто увидите эту ошибку, если родительский каталог (/ User/rokumar/Desktop) не существует. Я предполагаю, что/Пользователь должен быть/Пользователи ... –

+0

Создайте пустой проект, который имеет эту единственную строку 'open ('/ path/to/file', 'w')'. Это не так? – sashoalm

+0

Вы правы. Он должен быть Пользователем – station

ответ

1

Оно должно быть простым, как:

fname = "/User/rokumar/Desktop/sample.csv" 
with open(fname, "a") as f: 
    # do here what you want 
# it will get closed at this point by context manager 

Но я подозреваю, что вы пытаетесь использовать не существующий каталог. Обычно режим «a» создает файл, если он может быть создан.

Убедитесь, что каталог существует.

+0

Я думаю, что режим записи должен быть '' a'', если OP хочет добавить новые данные, а не обрезать все в существующем файле? – sthzg

+0

@sthzg Да, вы правы. Исправленный. –

1

Вы можете проверить, существуют ли все каталоги в file_path, прежде чем пытаться записать файл.

import os 

file_path = '/Users/Foo/Desktop/bar.txt' 
print os.path.dirname(file_path) 
# /Users/Foo/Desktop 

if not os.path.exists(os.path.dirname(file_path)): 
    os.mkdirs(os.path.dirname(file_path)) 
    # recursively create directories if necessary 

with open(file_path, "a") as my_file: 
    # mode a will either create the file if it does not exist 
    # or append the content to its end if it exists. 
    my_file.write(your_text_to_append) 

- Edit: Малый и, вероятно, нет необходимости расширения -

expanduser:
В вашем случае, как выяснилось, что первоначальная проблема была в недостающий s путь к каталогу пользователя, есть полезная функция для разрешения текущего каталога базовых пользователей (работает для unix, linux и windows): см. expanduser из модуля os.path. С этим вы можете написать свой путь как path = '~/Desktop/bar.txt', а тильда (~) будет расширяться точно так же, как на вашей оболочке. (С дополнительным преимуществом, что если вы начали свой сценарий от другого пользователя было бы затем расширить ее домашний каталог

App конфигурации каталога:.
Поскольку в большинстве случаев это не желательно, чтобы записать файл на рабочем столе (например, в системах * nix, возможно, не установлен рабочий стол), в click package есть большая функция полезности. Если вы посмотрите на get_app_dir() function on Github, вы увидите, как они обеспечивают расширение до соответствующего каталога приложений и поддержку нескольких операционных систем (функция не имеет зависимостей, кроме переменной WIN, которая определена в модуле _compat.py как WIN = sys.platform.startswith('win') и _posixify(), определенная в строке 17. Часто это хорошая отправная точка для определения каталога приложения для хранения определенных данных.

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