Исходные файлы автоматически удаляются процессом при компиляции кода.

Я написал код на python для преобразования данных dicom (.dcm) в файл csv. Однако, если я запускаю код более одного раза в каталоге базы данных, данные автоматически теряются/удаляются. Я попытался выполнить поиск в «Корзине», но не смог найти удаленные данные. Я не знаю о процессе, что пошло не так с данными.

Что-то не так с моим кодом? Любые предложения высоко ценятся.

вот мой код:

import xlsxwriter
import os.path
import sys
import dicom
import xlrd
import csv


root = input("Enter Directory Name: ")
#path = os.path.join(root, "targetdirectory")
i=1

for path, subdirs, files in os.walk(root):
    for name in files:

        os.rename(os.path.join(path, name), os.path.join(path,'MR000'+ str(i)+'.dcm'))
        i=i+1


dcm_files = []
for path, dirs, files in os.walk(root):
    for names in files:
        if names.endswith(".dcm"):
            dcm_files.append(os.path.join(path, names))

print (dcm_files)

with open('junk/test_0.csv', 'w', newline='') as csvfile:
        spamwriter = csv.writer(csvfile, delimiter=',',
                                quotechar='|',
                                quoting=csv.QUOTE_MINIMAL)

        spamwriter.writerow(["Folder Name","File Name", "PatientName",
                             "PatientID", "PatientBirthDate","SliceThickness","Rows"])

        for dcm_file in dcm_files:
            ds = dicom.read_file(dcm_file)
            fileName = dcm_file.split("/")
            spamwriter.writerow([fileName[1],fileName[2], 
                                 ds.get("PatientName", "None"), 
                                 ds.get("PatientID", "None"), 
                                 ds.get("PatientBirthDate", "None"), 
                                 ds.get("SliceThickness", "None"),
                                 ds.get("Rows", "None")])

person Asif    schedule 20.01.2018    source источник
comment
а если запустить код один раз? А что-то осталось?. Обратите внимание, что вы переименовываете свои файлы, поэтому они «исчезают»...   -  person joaquin    schedule 20.01.2018
comment
Если я запускаю код один раз, он просто переименовывает файлы с их исходного имени, но ничего не теряется, если я запускаю код второй раз, я начинаю терять файлы.   -  person Asif    schedule 20.01.2018
comment
Что вы имеете в виду под «я начинаю терять файлы»? Сколько вы потеряли, сколько осталось и как изменились их имена?   -  person joaquin    schedule 20.01.2018
comment
Если первоначальный размер базы данных составляет около 60 МБ, после второй итерации он становится около 40 МБ, но я не думаю, что существует шаблон потерянных файлов. Имена файлов не меняются, но файлы теряются, например, если у меня MR0001-10, то, вероятно, файлы 2,5,6 и т.д.   -  person Asif    schedule 20.01.2018


Ответы (1)


У вас есть что-то вроде следующего сценария:

После 1-й итерации вы заканчиваете файлами: MR0001.dcm, MR0002.dcm, MR0003.dcm... Во 2-й итерации происходят следующие изменения:

os.rename('some_file',  'MR0001.dcm')
os.rename('MR0001.dcm', 'MR0002.dcm')
os.rename('MR0002.dcm', 'MR0003.dcm')
os.rename('MR0003.dcm', 'MR0004.dcm')
...

Итак, в конце есть только файл «MR0004.dcm».

Добавьте следующую строку сразу после переименования:

print( os.path.join(path, name), '-->', os.path.join(path,'MR000'+ str(i)+'.dcm'))

Тогда вы увидите, какие именно файлы переименовываются.

person Bartłomiej    schedule 20.01.2018
comment
вы воспроизвели этот сценарий на практике?. Я запустил код, и файлы не исчезают. В случае, если новый файл (some_file) создается между запусками, вы получаете FileExistError, потому что вы не можете создать MR0001.dcm, если он уже существует. - person joaquin; 20.01.2018
comment
В этом случае я использовал os.replace вместо os.rename. В Linux код работает с os.rename, но показывает ошибку с pycharm в Windows. Я использовал os.replace во время работы в Windows, и файлы исчезают, если вы запускаете более 3/4 раз. - person Asif; 20.01.2018
comment
@joaquin, я только что повторил это ( pastebin ), и я понял, что порядок файлов в каталог не обязательно должен быть в алфавитном порядке. Но все равно файлы перезаписываются без проблем. - person Bartłomiej; 21.01.2018
comment
@Bartłomiej Это в Linux? Я вижу, что os.replace в Windows удаляет все, кроме одного файла, на второй итерации. os.rename не надо - person joaquin; 21.01.2018
comment
Правильно, Linux, Python 3.5.2. Кстати, раньше я не знал о различиях между Windows и Linux. См. этот ответ. - person Bartłomiej; 21.01.2018