Как правильно записывать данные в файл?

#python #file #writing

#python

Вопрос:

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

Это мой код:

 my_path = r'c:dataXYMDesktopMyFolder 7-sep'

with open(my_path   '\'   'Vehicles_MM'   '\'   name_vehicile   '-AB.txt', 'w') as output:
    writer = csv.writer(output, delimiter = 't')
    writer.writerow(headers)
    writer.writerow(data)
    for vehicle_loc_list in vehicle_loc_dict.values():
        for record_group in group_records(vehicle_loc_list):
            writer.writerow(output_record(record_group))
  

Это ошибка, которую я получаю:

 FileNotFoundError: [Errno 2] No such file or directory: 'c:\data\XYM\Desktop\MyFolder 7-sep\Vehicles_MM\20200907-AB.txt'
  

Комментарии:

1. Если Vehicles_MM каталог не существует, вы должны создать его, прежде чем сможете создавать в нем новые файлы.

2. @tripleee Vehicles_MM — это строка, а не каталог

3. Либо вы неправильно поняли мой комментарий, либо неправильно поняли свой собственный код. open(my_path '\' 'Vehicles_MM' '\' name_vehicile '-AB.txt', 'w') явно пытается создать файл в подкаталоге my_path a, имя которого Vehicles_MM .

Ответ №1:

Основываясь на откровениях в комментариях, проблема в том, что вы пытаетесь выполнить запись в подкаталог c:dataXYMDesktopMyFolder 7-sepVehicle_MM , который не существует, и в который на самом деле вы не хотите записывать.

Исправление заключается в удалении разделителя каталогов \ ; возможно, вместо этого используйте другой разделитель. Например,

 with open(my_path   '\'   'Vehicles_MM-'   name_vehicile   '-AB.txt', 'w') as output:
  

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

 os.makedirs(my_path   '\'   'Vehicles_MM', exist_ok=True)
with open(...
  

То же самое несколько более читаемо с pathlib.Path ;

 from pathlib import Path

my_path = Path(r'c:dataXYMDesktopMyFolder 7-sep')
vehicles_mm = my_path / 'Vehicles_MM'
vehicles_mm.mkdir(parents=True, exist_ok=True)
filename = vehicles_m / name_vehicile   '-AB.txt'
with filename.open('w') as output:
   ...
  

Ответ №2:

Вы должны использовать один из встроенных модулей для работы с путями. Либо os.path или pathlib.Path

 # with os.path:
import os.path as p
filename = p.join(my_path, "Vehicles_MM", name_vehicle   "-AB.txt")
assert p.exists(p.dirname(filename))

# with pathlib.Path:
from pathlib import Path
my_path = Path("c:dataXYMDesktopMyFolder 7-sep")
filename = my_path.joinpath("Vehicles_MM", name_vehicle   "-AB.txt")
assert filename.parent.exists()
  

Комментарии:

1. @qmuees, это не имеет ничего общего с записью. Я прав?

2. нет, это связано со способом форматирования путей и тем фактом, что python не создаст каталог, если он не был найден в файловой системе

3. Не следует w ли автоматически создавать файл, если этот файл не существует?

4. Да, но не в родительскую папку

5. Я хочу сказать: ваш путь, вероятно, отформатирован неправильно. Ошибка сообщает вам, что папка не найдена. Я предполагаю, что папка существует, но она отформатирована неправильно. Если папка не существует, ее необходимо создать.