2017-07-21 3 views
0

AIM: Je voulais enregistrer tous les fichiers sur une variété de disque dur et recueille le nom de fichier, les dossiers, et la taille du fichier en mégaoctets. Le code s'exécute, à ma connaissance ne produit pas d'erreurs, mais ne produit pas le fichier csv à la fin?Le code python ne génère pas le fichier csv

Ce que j'ai essayé: J'ai essayé d'exécuter le fichier avec Sudo, en changeant les permissions avec chmod + x, vérifier que python est au même endroit pour l'utilisateur standard et pour les utilisateurs de sudo, et enfin la suppression ou commenter des lignes gênantes qui semblent donner des résultats ou des erreurs différents selon le système d'exploitation.

import os 
from os import path 
import sys 
import datetime 
from datetime import date, time, timedelta 
import time 
import csv 
#from socket import gethostbyname 

#variables 
#hostname = str(socket.gethostname()) 
scandir = "/" 
savefiledir = "/Users/joshua/Documents/python/" 
textfilename = str(datetime.datetime.now().strftime("%Y-%m-%d")) + "_" "directory_printer.csv" 

#change directory to the root directory or the one which you want to scan for files (scandir) 
os.getcwd() 
os.chdir(scandir) 
directory = os.getcwd() 

#find all files in a directory and it's sub directory regardless of extension 
results = [val for sublist in [[os.path.join(i[0], j) for j in i[2]] for i in os.walk(directory)] for val in sublist] 

d = {} 
file_count = 0 
metadata = [] 

for file in results: 
    #full path 
    try: 
     fullpath = file 
    except: 
     fullpath = None 

    #file name 
    try: 
     file_directory = "/".join(str(file).split('/')[1:-1]) 
    except: 
     file_directory = None 

    #file extension 
    try: 
     file_ext = str(file).split('/')[-1] 
    except: 
     file_ext = None 

    #subfolders 
    try: 
     parts = file_directory.split('/') 
     sub_folders = ":".join(parts[1:-1]) 
    except: 
     sub_folders = None 

    #num subfolders 
    try: 
     count_subfolders = len(sub_folders.split(':')) 
    except: 
     count_subfolders = None 

    #filesize megabytes 
    try: 
     filesize_mb = os.path.getsize(file)/1024 
    except: 
     filesize_mb = None 

    #date modified 
    try: 
     date_modified = datetime.datetime.now() - datetime.datetime.fromtimestamp(path.getmtime(file)) 
    except: 
     date_modified = None 

    #time modified 
    #try: 
#  time_modified = os.stat(fullpath).st_mtime #time of most recent content modification 
    #except: 
#  time_modified = None 


    #time created (windows) 
# try: 
#  time_created = os.stat(fullpath).st_ctime #platform dependent; time of most recent metadata change on Unix, or the time of creation on Windows)# except: 
#  time_created = None 

    #record all file metadata 
    d[file_count] = {'Full_Path': fullpath, 'File_Directory': file_directory, 
        'File_Extension': file_ext, 'List_Sub_Folders' : sub_folders, 
        'Count_Sub_Folders' : count_subfolders, 'Filesize_mb' : filesize_mb, 
        'Date_Modified' : date_modified} 

    file_count = file_count + 1 

#write the dictinary with the disks file metadata to a csv file 
with open(textfilename,'w') as f: 
    w = csv.writer(f) 
    w.writerows(d.items()) 

print("Scanning directory: " 
     + str(scandir) + " complete!" + "\n" 
     + "The results have been saved to: " + "\n" 
     + str(savefiledir)+str(textfilename)) 
+1

Probablement pas le problème, mais il faut vérifier que 'results' n'est pas vide, par exemple par en insérant un 'print (len (results))' avant votre boucle for. Plus généralement, insérez du code de débogage pour voir ce qui se passe, si vous ne l'avez pas déjà fait. – bli

+1

Du point de vue du dépannage, pouvez-vous écrire quelque chose sur le disque? Ce qui signifie, si vous exécutez simplement quelque chose comme: avec open (TextFileName, 'w') comme f: w = csv.writer (f) w.write ('un texte aléatoire) Est-ce que ces trois lignes à écrire disque? Si non, alors le problème est d'écrire sur le disque Si oui, alors le problème est votre code >>> peut-être d.items() est vide, etc. –

+0

@ E.Ducateme le code de l'utilisateur AT jdehesa a résolu le problème, J'écrivais le csv final dans un répertoire différent. – yoshiserry

Répondre

1

Comme il est, il semble que votre code écrire le fichier CSV à scandir (/), pas savefiledir, car au début du programme que vous appelez os.chdir(scandir). Si vous voulez obtenir le fichier au bon endroit (où le message imprimé final indique qu'il est enregistré sur) vous devez faire:

# ... 
#write the dictinary with the disks file metadata to a csv file 
with open(savefiledir + textfilename,'w') as f: 
    w = csv.writer(f) 
    w.writerows(d.items()) 
# ...